لفرض أن لدي الجدول التالي في قاعدة البيانات
ونريد جلب البيانات التي قام 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`) = ?)
إذا ستكون النتيجة بالشكل التالي
انا كنت مستخدمها بس مش فاهم ليه شغاله بالطريقه دى وبالطريقه الأولى مش شغاله لكن دلوقتى فهمت .... تسلم يا باش مهندس
Ahmed
جزاك الله حيراً