preloader
軟體工程

Laravel 5.5 ORM 的 ( cond1 and cond2) OR (cond3 and cond4) 寫法

假設兩個 Model : A, B, 一對一關係,例如 A has B, B belongs A,當要撈出 A 中有 B 且符合 在 B 的篩選欄位條件。A 是 Post 貼文, B 是 Comment 評論,A 和 B 的更新日期時間欄位都是 u_date, u_time

假設要撈出過去 24 小時內有更新評論的貼文,不需撈出評論。

ORM 寫法請寫成這樣:

A->whereHas('B', function ($query) {
  return $query->where( function ($query) {
    return $query->where('u_date', '=', $yesterday->format("Y-m-d"))
                 ->where('u_time', '>=', $yesterday->format("H:i:s"));
  })
  ->orWhere(function ($query) {
    return $query->where('u_date', '=', $now->format("Y-m-d"))
                 ->where('u_time', '<=', '$now->format("H:i:s")');
  });
})->get();

以上 $now 和 $yesterday 使用 Carbon 套件, $yesterday 是由 $now 減一天得出的。

請切記要用 return ,如果你沒使用 return ,則 ORM 產生的 SQL where 條件比你想像的複雜,建議自行用 php artisan tinker 去驗證吧。