繁体   English   中英

获取 Laravel 中不同的唯一关系行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM