我在層次結構中有一個類別模塊。我需要通過檢查是否有任何父母不應該處于非活動狀態(假)來查詢該類別。
例如
- First category (inactive or false) 1.1 > First Category Child 1.1.1> First Category Grand Child
我的查詢
$category = Category::where('status',true)->where('title','like','%'.$keywords.'%')->paginate(10);
此查詢僅檢查其狀態是真還是假。但我還需要檢查其父級別的狀態。那么,有沒有辦法在查詢中檢查父級狀態。該類別可能有父級,也可能沒有父級。因此,因此 whereHas('parents') 不起作用。
uj5u.com熱心網友回復:
您可以通過提供關系名稱來使用 whereHas 方法:
$category = Category::where('status',true)->whereHas('parent', function ($q) {
$q->where('status', true)->whereHas('parent', function ($query) {
$query->where('status', true)});
})->where('title','like','%'.$keywords.'%')->paginate(10);
uj5u.com熱心網友回復:
有,假設您的類別模型看起來像這樣。
class Category extends Model {
public function parent() {
return $this->belongsTo(self::class, 'parent_id');
}
}
然后你可以利用whereHas(),提供一個閉包來檢查你的條件并在該關系中查詢你的條件。要處理沒有父母的情況,請檢查它是否有狀態正確的父母,或者是否沒有任何父母。
Category::where('status',true)
->where(funcion ($query) {
$query->whereHas('parent', function ($query) {
$query->where('status', true);
})->orDoesntHave('parent');
})->get();
對于多重嵌套,您可以通過不斷添加條件來解決它。它不是最佳的,但在查詢時您不知道嵌套。
->where(funcion ($query) {
$query->whereHas('parent.parent', function ($query) {
$query->where('status', true);
})->orDoesntHave('parent.parent');
})->where(funcion ($query) {
$query->whereHas('parent.parent.parent', function ($query) {
$query->where('status', true);
})->orDoesntHave('parent.parent.parent');
})
從長遠來看,另一種解決方案是制定邏輯,在所有類別的狀態發生變化時遞回更新狀態。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/323018.html
