2022-04-25|閱讀時間 ‧ 約 4 分鐘

Laravel Eloquent: with(), has(), whereHas()

本篇主要是要探討,with/has/whereHas/doesntHave/whereDoesntHave之間的差別,以部落格文章及留言一對多的例子來看。

資料情境:

文章1有2則留言,文章2有1則留言,文章3則沒有留言。

程式碼與結果:

其實這邊沒有定義關聯也沒差,因為待會程式中沒有從comment去取article。

$with_result = Article::with('comments')->get();
with有帶出的意思,這邊意思等於撈出所有文章也帶出對應的留言。

$has_result = Article::has('comments')->get();
has是把所有有留言的文章找出來,不帶出留言。

$has_with_result = Article::has('comments')->with('comments')->get();
has+with是把所有有留言的文章找出來,帶出留言。

 $whereHas_result = Article::whereHas('comments', function($q){
     $q->where('create_datetime', '>=', '2022-04-02 00:00:00');
 })->get();
whereHas找出所有有留言&任一留言有create_datetime = 2022-04-02 00:00:00的文章。

$doesntHave_result = Article::doesntHave('comments')->get();
doesntHave找出所有沒有留言的文章。

$whereDoesntHave_result_1 = Article::whereDoesntHave('comments', function($q){
    $q->where('create_datetime', '>=', '2022-04-02 00:00:00');
})->get();
找出所有沒有留言or 所有留言create_datetime皆非=2022-04-02 00:00:00的文章。

$whereDoesntHave_with_result_1 = Article::whereDoesntHave('comments', function($q){
    $q->where('create_datetime', '>=', '2022-04-02 00:00:00');
})->with('comments')->get();
whereDoesntHave+with 同上,只是把留言也找出來。

$whereDoesntHave_result_2 = Article::whereDoesntHave('comments', function($q){
    $q->where('create_datetime', '<=', '2022-04-02 00:00:00');
})->get();
whereDoesntHave找出所有沒有留言or 所有留言create_datetime皆非=2022-04-02 00:00:00的文章。
分享至
成為作者繼續創作的動力吧!
小弟是一位軟體工程師,樂於幫助他人,撰寫技術文章除了幫助自己複習以外,也希望可以幫助到他人,若文章內容有誤,還請大大不吝給予指教!
從 Google News 追蹤更多 vocus 的最新精選內容從 Google News 追蹤更多 vocus 的最新精選內容

發表回應

成為會員 後即可發表留言