2017-08-25 112 views
1

有人問這個問題,但沒有人提供了這個問題的令人滿意的解釋。Laravel渴望加載和whereHas

我運行下面的查詢:

$return = Vacation::whereHas('dates', function ($query) use ($from, $to) { 
    $query->whereBetween('start_date', [$from, $to]); 
})->get(); 

根據查詢記錄,這將產生以下SQL。返回的結果是正確的,但JOINed數據存在問題。

select * from `vacations` where exists (select * from `vacation_dates` where `vacations`.`id` = `vacation_dates`.`vacation_id` and `start_date` between '2017-08-01 00:00:00' and '2017-08-30 00:00:00') 

由於沒有JOIN,相關記錄隨後通過預先加載添加並且約束丟失。

該方案涉及Vacations有多個啓動/停止日期,我想檢查哪些假期有$start$end日期範圍內的start_date

如果沒有發生,則不會返回任何記錄。

當發生某種情況時,Vacation會返回所有日期,而不僅僅是約束中的那些日期。

我明白它是如何/它在做什麼,但看不到我需要什麼:記錄與連接的數據遵循約束。

有人嗎?

+0

你試過whereRaw()呢? –

+0

是的,似乎沒有做我想要的。 – stef

回答

2

解決方案:

$callback = function($query) use($from, $to) { 
      $query->whereBetween('start_date', [$from, $to]); 
     }; 
     $return = Vacation::whereHas('dates', $callback)->with(['dates' => $callback])->get(); 

Solution is from this SO post

+1

很好,你找到它了 –