2 回答

TA貢獻1856條經驗 獲得超17個贊
查詢
如果您只是在尋找標簽名稱的不同列表,您可以組合distinct()方法和pluck()方法:
$tags = Tag::distinct()->pluck('name');
這將為您提供系統中所有唯一標簽名稱的集合。
如果您確實需要擁有 Tag 模型實例,您可以嘗試兩件事。
首先,如果你有完全重復的標簽行,你可以添加distinct()到你的標簽查詢中(因為你需要修改查詢,你需要從 using 更改all()為get()(在此處閱讀更多):
$tags = Tag::distinct()->get();
其次,如果您的標簽有其他不明確的信息(ID、時間戳等),那將不起作用。如果是這種情況,您需要使用子查詢來選擇您想要的標簽:
$tags = Tag::whereIn('id', Tag::groupBy('name')->selectRaw('MAX(id)'))->get();
這將為您的唯一名稱集提供完全填充的 Tag 模型實例。
收藏
最后,如果您已經有一個 Tag 實例的集合,并且您想根據名稱獲得一個唯一的集合,您可以unique在集合上使用該方法。
// somewhere
$tags = Tag::get();
// somewhere else
$tags = $tags->unique('name');
如果您還沒有該集合,請確保使用上述查詢構建器方法之一。如果使用collection方式,則必須先構建并水化所有Tag模型實例,然后再進行唯一處理。您不希望獲取和水合 10000 個標簽模型實例以最終得到 30 個獨特的標簽,而此時您可以首先從數據庫中獲取這 30 個標簽。

TA貢獻1836條經驗 獲得超13個贊
您可以unique()
在集合上使用該方法,即:
$tags = Tag::all()->unique('name');
使用您的描述符字段而不是name
.
該distinct()
方法最好與有限的字段選擇一起使用,例如:
DB::table('tags')->distinct()->get(['name']);
如果你使用distinct()
on Model
likeTag::distinct()->get();
你會得到所有的標簽,因為它們有不同的ids
,timestamps
即使它們有相同的名稱或描述,因為在這種情況下,選擇是在所有字段上。
使用模型,您必須像這樣限制返回的字段:
Tag::distinct()->get(['name']);
- 2 回答
- 0 關注
- 145 瀏覽
添加回答
舉報