提问者:小点点

Laravel连接和不同


在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个答案

匿名用户

可以你需要提供更多的上下文。

从事物的外观来看,你有一个1: n的关系,其中TableA有许多TableB。因此,如果进行连接,可能会有多个TableB记录加入到TableA记录中,这是可以的。

但是,如果您想要选择一个不同的TableA记录,那么如果存在多个TableB记录,那么应该返回多个可能的TableB记录中的哪一个?

实现您的要求的一个简单方法是使用分组方式

$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,而不必从表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();

匿名用户

$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();

只选择要按其分组的列。