[英]Get unique relation rows with distinct in Laravel
假设我有Category
model 与Product
hasMany
有很多关系。 产品有color
栏。
我想返回该类别中存在的所有 colors 的所有类别,所以我尝试了:
return Category::with(['products' => function ($query) {
$query->distinct('color');
}])->get();
多亏了这一点,我以后可以 foreach 或采摘category->products
以获得独特的 colors 列表。 我知道我可以只获取每个类别中的所有产品,然后过滤唯一的 colors,但是这样做我必须查询每个类别 1000 个产品,而不是 5 个,这是不必要的资源繁重。 这就是为什么我试图在 SQL 级别而不是 PHP 上执行此操作。
但是这段代码不起作用。 没有错误,它仍然返回所有具有重复 colors 的产品。 为什么?
编辑:
不知道为什么,但如果我在区分之前添加select()
和使用的列,然后 distinct 是所有选定的列创建唯一的行,我的代码可以工作。 不需要不同的“颜色”参数。 不知道为什么会这样,需要深入研究 SQL 文档。
你试过这个代码吗? 不知何故,这将减少您不必要的查询。
$categories = Category::with([
'products'=> fn($q) => $q->select(['category_id', 'color'])->distinct('color')
])
->select('id') // select required column in categories table
->whereHas('products')
->get();
$colors = $categories->map(function($category) {
return $category->products->pluck('color');
})->toArray();
$color = [];
for ($i=0; $i < count($colors); $i++) {
$color = array_merge($color, $colors[$i]);
}
$uniqueColor = array_unique($color);
return $categories;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.