Laravel加入并与众不同

时间:2017-07-28 00:02:13

标签: php laravel eloquent

在Laravel中,我有一个查询:

$productsModel->join('tags', 'tags.item_id', '=', 'products.id')
      ->select('products.*', 'tags.item_id')
      ->distinct();

DB tables looks like this:
| products | tags    |
 ----------|---------|
| id       | id      |
|          | item_id |

产品与标签有一对多的关系,这会在连接表时产生问题。例如,我需要根据多个标签查询产品,但我只需显示一个产品。

2 个答案:

答案 0 :(得分:3)

好。您将不得不提供更多背景信息。

从外观上看,你有一个1:n的关系,其中TableA有很多TableB。因此,如果您进行连接,则可能有多个TableB记录连接到TableA记录,这很好。

但是,如果你想选择一个不同的TableA记录,应该返回多个可能的TableB记录中的哪一个,如果有多个?

实现您所要求的一种简单方法是使用GROUP BY

$tableA->selectRaw('table_a.*, MAX(table_b.item_id) AS item_id')
    ->join('table_b', 'table_a.id', '=', 'table_b.item_id')
    ->groupBy('table_a.id')
    ->get();

还值得一提的是,选择table_b.item_id并非必要,因为该值始终等于table_a.id。只是说。

修改 - 根据您更新的问题,如果您只想查找包含特定代码的产品,可以使用WHERE IN,而不是从table_b中选择字段。

$tableA->select('table_a.*')
    ->join('table_b', 'table_a.id', '=', 'table_b.item_id')
    ->whereIn('table_b.id', [1, 2, 3])
    ->groupBy('table_a.id')
    ->get();

答案 1 :(得分:0)

$tableA->select('table_a.id')
->join('table_b', 'table_a.id', '=', 'table_b.item_id')
->whereIn('table_b.id', [1, 2, 3])
->groupBy('table_a.id')
->get();

仅选择要分组的列。