2015-12-02 103 views
0

從URL我得到$filter,$month或兩者。例如,當我只想顯示11月份的結果時,使用下面的代碼可以正常工作。但是,如果篩選器已設置,則它會顯示所有結果(也來自其他月份),如果篩選器已在數據庫中找到。Laravel顯示關係結果

我想要實現的是,如果在數據庫中找到設置的過濾器,則只顯示結果;如果設置了一個月,則僅顯示該特定月份的結果。

My Section和Expense模型分別擁有belongsTo和hasMany關係。

$query = Section::query(); 

如果過濾器已設置:

if ($filter !== 'false') { 
     $query->with(['expenses' => function ($query) use ($month) { 
      $query->where('date', 'LIKE', '%2015-' . Carbon::parse($month)->format('m') . '%'); 
     }]); 
    } 

如果一個月已設置:

if ($month !== 'false') { 
     $query->with(['expenses' => function ($query) use ($filter) { 
      $query->where('type', '=', $filter); 
     }]); 
    } 

我也試過下面的代碼:

if ($filter !== 'false') { 
     $query->with('expenses')->whereHas('expenses', function($query) use ($filter) { 
      $query->where('type', '=', $filter); 
     }); 
    } 

    if ($month !== 'false') { 
     $query->with('expenses')->whereHas('expenses', function($query) use ($month) { 
      $query->where('date', 'LIKE', '%2015-' . Carbon::parse($month)->format('m') . '%'); 
     }); 
    } 

$expenses = $query->orderBy('section', 'asc')->paginate(25); 

我在我看來,在$expenses上使用foreach o顯示結果。

回答

1

隨着你擁有它的方式,你正在用另一個覆蓋一個急切的加載約束。你需要將所有的檢查進入一個預先加載的約束,就像這樣:

$query->with(['expenses' => function ($q) use ($month, $filter) { 
    if ($month !== 'false') { 
     $q->where('date', 'LIKE', '%2015-' . Carbon::parse($month)->format('m') . '%'); 
    } 
    if ($filter !== 'false') { 
     $q->where('type', '=', $filter); 
    } 
}]); 
+0

真棒,所以簡單的我很慚愧:) – Hardist

1

必須同時結合,否則最後一個是由第一雄辯模式設置狀態搞亂。

快速修復和理解發生了什麼嘗試:

if ($filter !== 'false') { 
     $query = $query->with('expenses')->whereHas('expenses', function($query) use ($filter) { 
      $query->where('type', '=', $filter); 
     }); 
    } 

    if ($month !== 'false') { 
     $query = $query->with('expenses')->whereHas('expenses', function($query) use ($month) { 
      $query->where('date', 'LIKE', '%2015-' . Carbon::parse($month)->format('m') . '%'); 
     }); 
    } 

$expenses = $query->orderBy('section', 'asc')->paginate(25); 

在正確scenenario你應該處理所有和條件內罩內。

它可以使用

$query->where(condition1); 
$query->where(condition2); 

$query->where(condition1) 
     ->where(condition2); 

做看看這個answerdocumentation