
3 مزايا جديدة في Laravel 12 لتسهيل التعامل مع Eloquent ORM
مقدمة
في كل إصدار جديد من Laravel، يتم تقديم تحسينات تجعل التعامل مع البيانات أكثر سهولة ومرونة. وفي Laravel 12، تم إدخال ثلاث ميزات مذهلة تسهّل استخدام Eloquent ORM في سيناريوهات حقيقية مثل العلاقات المعقّدة، الأداء العالي، والإدخال السريع للبيانات.
في هذا المقال، سنتناول ثلاث ميزات رئيسية:
whereAttachedTo
withRelationshipAutoloading
fillAndInsert
مع شرح تفصيلي لكل ميزة وأمثلة عملية توضّح مدى فائدتها.
نبذة عن Laravel 12 وEloquent ORM
من أبرز ما جاء في Laravel 12 هو تعزيز واجهات التعامل مع Eloquent ORM، خصوصًا فيما يتعلق بالعلاقات (Relationships) وإدارة البيانات بكفاءة. سنتناول هنا مثالًا تقليديًا لعلاقة Many-to-Many بين نموذج Post
ونموذج Tag
.
مثال على علاقة Many-to-Many (Post ↔ Tags)
نموذج Post
class Post extends Model { public function tags() { return $this->belongsToMany(Tag::class); } }
نموذج Tag
class Tag extends Model { public function posts() { return $this->belongsToMany(Post::class); } }
1️⃣ الطريقة القديمة لجلب بوستات مرتبطة بتاغات خلال 3 شهور ماضية
$tags = Tag::where('created_at', '>', now()->subMonths(3))->get(); $posts = Post::whereHas('tags', function($query) use ($tags) { $query->whereIn('id', $tags->pluck('id')); })->get();
2️⃣ الطريقة الجديدة باستخدام whereAttachedTo
$tags = Tag::where('created_at', '>', now()->subMonths(3))->get(); $posts = Post::whereAttachedTo($tags)->get();
كيف تعمل whereAttachedTo
؟
هذه الميثود الجديدة تمكّنك من جلب السجلات المرتبطة بعلاقات belongsToMany
و morphToMany
بدون الحاجة لتحديد العلاقة صراحة. ومع ذلك، يمكنك تحديد العلاقة كوسيط ثانٍ:
Post::whereAttachedTo($tags, 'tags')->get();
3️⃣ withRelationshipAutoloading
لحل مشكلة Lazy Loading
مثال على Lazy Loading يسبب N+1 Problem:
<table> @foreach($posts as $post) <tr> <td>{{ $post->title }}</td> <td>{{ $post->user->name }}</td> <!-- هنا يتم استدعاء query لكل صف --> </tr> @endforeach </table>
الحل: Eager Loading
$posts = Post::with('user')->get();
4️⃣ الميزة الجديدة: withRelationshipAutoloading
تفعيل التحميل المسبق تلقائيًا لموديل معين:
Post::withRelationshipAutoloading(); $posts = Post::all(); // سيتم تحميل علاقة user تلقائيًا لو تم استخدامها
تفعيل الميزة لجميع الموديلات في AppServiceProvider
:
use Illuminate\Database\Eloquent\Model; public function boot(): void { Model::preventLazyLoading(); Model::withRelationshipAutoloading(); }
5️⃣ التعامل مع الإدخال الجماعي للبيانات (Bulk Insert)
المشكلة:
User::insert([ ['name' => 'Muath', 'email' => 'muath@example.com', 'password' => bcrypt('123')], ['name' => 'Hussam', 'email' => 'hussam@example.com', 'password' => bcrypt('123')], ]);
الميثود insert
لا تقوم بتفعيل mutators
مثل setPasswordAttribute
، ولا تضيف created_at
و updated_at
تلقائيًا.
مثال على mutator يتم تجاهله عند استخدام insert:
public function setNameAttribute($value) { $this->attributes['name'] = strtoupper($value); }
6️⃣ الحل: fillAndInsert
مثال:
User::fillAndInsert([ ['name' => 'Muath', 'email' => 'muath@example.com', 'password' => '123'], ['name' => 'Hussam', 'email' => 'hussam@example.com', 'password' => '123'], ]);
سيتم:
- تفعيل
mutators
مثلpassword
hashing وname
إلى uppercase. - تعبئة الحقول التلقائية مثل
created_at
.
الخاتمة
تستمر Laravel في تقديم أدوات قوية تسهّل حياة المطورين، وتزيد من كفاءة كتابة الكود اليومي. سواء كنت تعمل على مشروع صغير أو نظام كبير، الميزات الجديدة مثل whereAttachedTo
, withRelationshipAutoloading
، وfillAndInsert
تتيح لك كتابة كود أنظف، أسرع، وأسهل في الصيانة.
هل جرّبت أي من هذه الميزات؟ شاركنا تجربتك في التعليقات!