簡體   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