فقط في لارافيل 8، إستخدام withSum,withMax,withMin,withAvg في العلاقات

فقط في لارافيل 8، إستخدام withSum,withMax,withMin,withAvg في العلاقات

2024-05-15 وقت القراءه : 3 دقائق

في قصاصة برمجية سابقة تحدثنا عن الدالة الرائعة withCount والتي تساعدنا في معرفة عدد الحقول الأبناء، مثل أنه إذا كان لدي مقال وأريد أن أعرض كل مقال وعدد التعليقات على كل مقال، ولروعة لارافيل فإنه في الإصدار الثامن تم إضافة مجموعة من الدوال الأخرى والتي تساعدنا في معرفة المجموع، المعدل، القيمة الأعلى والتي سنتعرف عليها في هذا المقال.


 لنفرض أن لدي الحقول التالية

حقل المؤلفين

Schema::create('authors', function (Blueprint $table) {
    $table->id();
    $table->string('title',100);
    $table->timestamps();
});

حقل الكتب

Schema::create('books', function (Blueprint $table) {
    $table->id();
    $table->string('title',120);
    $table->float('price');
    $table->bigInteger('author_id')->unsigned()->index();
    $table->foreign('author_id')->references('id')->on('authors')->onDelete('Cascade')->onUpdate('Cascade');
    $table->timestamps();
});

 العلاقة بين جدولي المؤلفين والكتب

class Author extends Model
{
    use HasFactory;
    public function books(){
        return $this->hasMany('App\Models\Book');
    }
}


الأن نأتي لشرح الدوال


الدالة الأولى withSum

نستخدم الدالة لمعرفة مجموع حقول معينة، مثلا هنا أريد عرض المؤلف مع مجموع أسعار الكتب التابعة له

public function index(){
    $authors=Author::select('id','first_name')->withSum('books','price')->get();
    return $authors;
}

النتيجة تكون على الشكل التالي

{
  "id": 138,
  "first_name": "Edward",
  "books_sum_price": 1580
},
{
  "id": 139,
  "first_name": "Ghassan ",
  "books_sum_price": 1130
},

كما نلاحظ أنه تم إنشاء حقل جديد بالعرض (غير موجود بقاعدة البيانات)، بإسم books_sum_price تم عرض مجموع أسعار الكتب لكل كاتب.




الدالة الثانية withAvg

إذا أردنا أن نعرض كل كاتب مع معدل أسعار الكتب له

public function index(){
    $authors=Author::select('id','first_name')->withAvg('books','price')->get();
    return $authors;
}

النتيجة تكون على الشكل التالي

{
  "id": 138,
  "first_name": "Edward",
  "books_avg_price": 56.42857142857143
},
{
  "id": 139,
  "first_name": "Ghassan ",
  "books_avg_price": 56.5
},

كما نلاحظ أنه تم إنشاء حقل جديد بإسم books_avg_price




الدالة الثالثة withMin

إذا اردنا عرض كل كاتب مع أقل سعر كتاب له

public function index(){
    $authors=Author::select('id','first_name')->withMin('books','price')->get();
    return $authors;
}

كالأمثلة السابقة حيث سيتم إضافة حقل books_min_price

{
  "id": 138,
  "first_name": "Edward",
  "books_min_price": 40
},


الدالة الرابعة withMax

إذا أردنا عرض كل كاتب مع أعلى سعر كتاب له

public function index(){
    $authors=Author::select('id','first_name')->withMax('books','price')->get();
    return $authors;
}

كالأمثلة السابقة حيث سيتم إضافة حقل books_max_price

{
  "id": 138,
  "first_name": "Edward",
  "books_max_price": 75
},


الدالة الخامسة withCount

هذه الدالة تم شرحها سابقا، وهي لجلب الكتاب مع عدد الكتب التابعة لهم

public function index(){
    $authors=Author::select('id','first_name')->withCount('books')->get();
    return $authors;
}

كالأمثلة السابقة حيث سيتم إضافة حقل books_count

{
  "id": 138,
  "first_name": "Edward",
  "books_count": 10
},

التعليقات
Sam
منذ 3 سنوات

اكثر من رائع سلمت الانامل

tohami
منذ سنة

جمال حد الخيال عاش نضال الشعب الفلسطيني

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