متى وكيف يجب إستخدام الأقواس في Laravel Eloquent

متى وكيف يجب إستخدام الأقواس في Laravel Eloquent

2024-03-04 وقت القراءه : 2 دقائق

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

ونريد جلب البيانات التي قام 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
منذ سنتين

جزاك الله حيراً

زائر
منذ سنتين

انا كنت مستخدمها بس مش فاهم ليه شغاله بالطريقه دى وبالطريقه الأولى مش شغاله لكن دلوقتى فهمت .... تسلم يا باش مهندس

إضافة تعليق
Loading...