在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 |
产品与标签有一对多的关系,这在连接表时会产生问题。举个例子,我需要基于多个标签查询产品,但是我需要只显示一个产品。
可以你需要提供更多的上下文。
从事物的外观来看,你有一个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();
只选择要按其分组的列。