تخصيص المجموعات في Laravel باستخدام CollectedBy

تخصيص المجموعات في لارافيل باستخدام CollectedBy عند العمل مع مجموعات Eloquent، قد تحتاج إلى إضافة وظائف محددة تنطبق فقط على أنواع نماذج معينة. توفر سمة CollectedBy الجديدة في لارافيل طريقة واضحة لتخصيص المجموعات دون تجاوز طرق النموذج، مما يجعل كودك أكثر قابلية للصيانة ووضوحاً في النوايا. في السابق، كان تخصيص مجموعات النماذج يتطلب تجاوز طريقة newCollection()، ولكن هذا النهج الجديد القائم على السمات يوفر حلاً أنظف على مستوى الصنف.
use Illuminate\Database\Eloquent\Attributes\CollectedBy;
 
#[CollectedBy(CustomCollection::class)]
class YourModel extends Model
{
// Model implementation
}
دعونا نستكشف مثالاً عملياً مع كتالوج منتجات التجارة الإلكترونية:
// Product Collection
<?php
 
namespace App\Collections;
 
use Illuminate\Database\Eloquent\Collection;
 
class ProductCollection extends Collection
{
public function inStock()
{
return $this->filter(fn($product) => $product->stock_count > 0);
}
 
public function onSale()
{
return $this->filter(fn($product) => $product->discount_percentage > 0);
}
 
public function byPriceRange($min, $max)
{
return $this->filter(function($product) use ($min, $max) {
$price = $product->getEffectivePrice();
return $price >= $min && $price <= $max;
});
}
 
public function topRated()
{
return $this->filter(fn($product) => $product->average_rating >= 4)
->sortByDesc('average_rating');
}
}
 
//Product model
namespace App\Models;
 
use App\Collections\ProductCollection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Attributes\CollectedBy;
 
#[CollectedBy(ProductCollection::class)]
class Product extends Model
{
public function getEffectivePrice()
{
if ($this->discount_percentage > 0) {
return $this->price * (1 - $this->discount_percentage / 100);
}
 
return $this->price;
}
}
تُبسط سمة CollectedBy تخصيص المجموعات مع الحفاظ على كود نظيف وقابل للقراءة في تطبيقات لارافيل.
جميع الحقوق محفوظة © 2025 Laravel | عربي