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