1

我正在寻找一种解决方案,该解决方案将提取用于匹配来自不同表的其他数据的基本数据。然后我想以表格的形式在刀片中显示这些数据。

在数据库内部,我有一个“匹配”实体,它存储我想用于匹配的用户凭据(例如所需的产品价格)。实体包含“peopleID”作为“匹配”属于网站用户。创建用户时,我们分配匹配选项,这些选项存储在该“匹配”实体中。匹配实体中的行数取决于在用户创建阶段选择的县数。

我知道要从数据库中提取匹配数据,我需要使用 foreach 循环。

我遇到的问题是当我在刀片内部输出数据时。由于某种原因,它仅将产品与数组中的最后一项匹配。它应该将产品与所有匹配的凭据相匹配。

代码:

        $matchings = Match::where('PeopleID', '=', $id)->get();
        $sales = DB::table('sales');

        foreach ($matchings as $matching)
        {
            $county = $matching->county;
            $sales->where('county', '=', $county);

        }

        $results = $sales->get();

因此,对于其中一位客户,我有两个不同“县”的匹配项。它只显示最后添加的数据。我怎样才能让它显示包含不同县的其他匹配的数据。我希望你知道我的意思。

谢谢你的帮助。

更新 - 代码的主要部分已完成。谢谢您的帮助。

第二个问题是关于添加其余匹配选项。如前所述,匹配的数量取决于添加的县的数量。每场比赛都有自己的属性。这个想法是显示每个县的匹配结果。

我知道我需要一些 if 语句来做到这一点。

这是我想实现的示例:

            $maxprice = $match->maxprice;
            $minprice = $match->minprice;
            $brand_a = $match->brand_a;
            $brand_b = $match->brand_b;

            if($maxprice != '0')
            {
                $sales = DB::table('sales')->where('maxprice', '<=', $maxprice);
            }

            if($minprice != '0')
            {
                $sales = DB::table('sales')->where('minprice', '>=', $minprice);
            }

            if($brand_a == '1')
            {
                $sales = DB::table('sales')->where('brand_a', '1');
            }

            if($brand_b == '1')
            {
                $sales = DB::table('sales')->where('brand_b', '1');
            }

对此代码:

$user = User::find($id); // get our User with the Id (person id?)

$matches = $user->matches; // get all the matches

// or you could one line the above: $matches = User::find($id)->matches;

// get all the counties in the returned matches, could use pluck() method in    higher version of laravel
$counties = [];

foreach($matches as $match) {
    $counties[] = $match->county;
}

$results = DB::table('sales')->whereIn('county', $counties)->get();

非常感谢您的帮助!

@更新

关系:

匹配:

public function people()
{
    return $this->belongsTo('People', 'PeopleID', 'PeopleID');
}

人们:

public function matches()
{
    return $this->hasMany('Match', 'PeopleID', 'PeopleID');
}

我在它们之间有联系,因为 Match 拥有人们的“搜索”凭据。您提供的第一个解决方案完美运行。现在,该解决方案按县过滤了销售额,这是一个很好的举措,因为现在需要按最低和最高价格(minprice、maxprice)和其他凭据(如brand_a 和brand_b)过滤它们。

brand_a 和brand_b 的思想:复选框负责改变Matching 中的brand_a 和brand_b 值。如果选中这些,匹配实体内的值将变为“1”。如果未选中这些,它们将变为“0”,这意味着销售额不必被这些值过滤掉。

销售实体包含“Holdings”属性。“Holdings”的值可以是brand_a 或brand_b。销售还包含“价格”。

因此,为了明确这一点:

销售实体包含:SaleID、Price、Holdings、County。

持有是值:brand_a 或brand_b。价格只是一个数字。县是纯文本。

匹配实体包含:PeopleID、MinimumPrice、MaximumPrice、brand_a、brand_b、county。

PeopleID 是外键。我们需要知道哪个匹配属于哪个用户。(根据所选县的数量,一个用户可以有多个匹配项)。MinimumPrice 和 MaximumPrice 是数字。brand_a 和 brand_b 是值(1 或 0),具体取决于复选框是否被选中。县是县名。

现在,如果人员 1543 (peopleID = 1543) 包含 3 个匹配项,每个匹配项包含不同的搜索凭据。

第一个:PeopleID:1543 最低价格:1000 最高价格:7000 品牌_a:0 品牌_b:1 县:county_a

第二: PeopleID:1543 最低价格:2500 最高价格:10000 品牌_a:1 品牌_b:1 县:county_f

第三: PeopleID:1543 MiniumPrice:2000 MaximumPrice:9500 brand_a:0 brand_b:0 县:county_d

我需要将此数据与 Sales 中的数据进行匹配。可以有超过 1,000 种不同价格的不同销售等。我只需要过滤它们并根据人的匹配显示该人所需的销售。

我希望这能更好地向您展示这种情况。谢谢。

4

1 回答 1

1

简而言之,我相信您需要利用Eloquent 关系来轻松检索您想要的数据。在此处阅读文档中的关系:https ://laravel.com/docs/4.2/eloquent#relationships 。

我做了一些假设,因此您可能需要在实际设置中进行以下操作。此外,我发现很难 100% 从您的问题中理解您的数据库结构,但是从我从您的问题中收集到的信息中,您的数据库结构是这样的:

User/Person *has many* Match

(注意:名称可能是错误的,但你没有在问题中提到它的名称,我所看到的只是“用户”和“personId”这个词)

Match *belongs to* User/Person

基于此,我认为您应该像这样建立您的关系:

用户 类用户扩展 Eloquent {

    public function matches()
    {
        return $this->hasMany('Match');
    }

    //...
}

匹配 类 Match 扩展 Eloquent {

    public function user()
    {
        return $this->belongsTo('User');
    }

    //...
}

然后您的代码可能如下所示:

$user = User::find($id); // get our User with the Id (person id?)

$matches = $user->matches; // get all the matches

// or you could one line the above: $matches = User::find($id)->matches;

// get all the counties in the returned matches, could use pluck() method in higher version of laravel
$counties = [];

foreach($matches as $match) {
    $counties[] = $match->county;
}

$results = DB::table('sales')->whereIn('county', $counties)->get();

解决这个问题的一个更好的方法(我认为)是给County它自己的实体然后Match会有一个county_id然后你可以使用 a has many through relationship 如果你可以链接Match,CountySales. 您可以在此处的文档中阅读有关has many through的更多信息: https ://laravel.com/docs/4.2/eloquent#has-many-through

另外,附带一点...您的代码的这一部分:

$sales->where('county', '=', $county);

只会不断地将 where 语句添加到您的查询中,我想如果有多个语句,我将不会返回任何内容。

为了更清楚起见,假设您有 2 个县“county_1”和县“county_2”,通过您的 for 循环,您的查询最终会像这样:

WHERE COUNTY = "county_1"   // first loop
AND COUNTY = "county_2"     // second loop

正如你所看到的,一场比赛不能同时是两个县!->orWhere('county', 'county_value')所以你可能在添加第一个之后寻找,但更好的方法是使用whereIn('county', $countiesArray)它可以传递你建立的数组,这就是我在上面所做的。

希望这可以帮助!如果不清楚,请告诉我。

编辑

最好的方法是在SaleMatch实体之间建立关系。由于我仍然不完全了解您的数据库架构,因此我不能很好地建议您将如何处理它。如果您提供更多详细信息,它可能是可能的。

或者,您可以通过构建一个数组来处理代码,您将使用该数组将条件应用于您的查询。考虑一下你用四个 if 语句更新的问题,任何时候你像这样重复自己,更常见的是它不能被简化。

$filters = [
    'maxprice' => $match->maxprice,
    'minprice' => $match->minprice,
    'brand_a'  => $match->brand_a,
    'brand_b'  => $match->brand_b,
];

$salesQuery = DB::table('sales');

foreach($filters as $key => $value) {
    if($value) {
        $salesQuery->where($key, $value);
    }
}

$results = $salesQuery->get();

由于您的问题代码中的条件更加严格,因此您可以这样做:

foreach($filters as $key => $value) {
    if ($value) {
        if (in_array(['brand_a', 'brand_b'], $key)) {
            $salesQuery->where($key, $value);
        } else if($key === 'minprice') {
            $salesQuery->where($key, '>=' $value);
        } else if($key === 'maxprice') {
            $salesQuery->where($key, '<=' $value);
        }
    }
}

这种方法的好处是您可以通过过滤器数组轻松添加新的条件,而不必每次都编写新的 if 语句和查询/where 代码。

我要强调这可能不是最好的方法,理想情况下你会利用雄辩的关系,但如果你不能马上弄清楚,这可能是一个起点。

于 2016-07-22T10:49:56.390 回答