لفرض أن لدي الجدول التالي في قاعدة البيانات

ونريد جلب البيانات التي قام user_id=1 بإنشائها، والتي تم إنشاءها في العام 2019 او التي قام بالتعديل عليها عام 2019، فإننا سوف نستخدم الكود التالي
public function index(){
$articles = Article::where('user_id', 1)
->whereYear('created_at', 2019)
->orWhereYear('updated_at', 2019)
->get();
return view('/article', compact('articles'));
}حسب الكود أعلاه فإننا سوف نحصل على النتائج التالية:

لكن لماذا حصل ذلك، لماذا تم جلب 6 حقول وليس 2.
لنفهم ذلك، سنقوم بتحويل الكود إلى جملة sql بإستخدام toSql عوضا عن إستخدام get
public function index(){
$articles = Article::where('user_id', 1)
->whereYear('created_at', 2019)
->orWhereYear('updated_at', 2019)
->toSql();
return $articles;
}اذا نرى أن جملة sql هي
select * from `articles` where `user_id` = ? and year(`created_at`) = ? or year(`updated_at`) = ?كما نرى أنه تم جلب بيانات المستخدم ١ والبيانات التي تم إنشاؤها في 2019 أولا، ثم تم جلب البيانات التي تم التعديل عليها في العام 2019 دون النظر إن كان التعديل تم من المستخدم رقم ١
لحل هذه الشكلة فإنه يجب إستخدام الأقواس {} لكن كيف
public function index(){
$articles = Article::where('user_id', 1)
->where(function ($query) {
return $query->whereYear('created_at', 2019)
->orWhereYear('updated_at', 2019);
})->toSql();
return $articles;
}
هنا جملة sql ستكون بالشكل التالي
select * from `articles` where `user_id` = ? and (year(`created_at`) = ? or year(`updated_at`) = ?)كما نرى أن الأكواد هنا تحيط
(year(`created_at`) = ? or year(`updated_at`) = ?)إذا ستكون النتيجة بالشكل التالي
