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

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

2024-05-14 وقت القراءه : 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
منذ 3 سنوات

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

زائر
منذ 3 سنوات

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

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