البرمجة

استخدام منشئ الاستعلامات في Laravel

جدول المحتوى

كيف تستخدم منشئ الاستعلامات (Query Builder) للتخاطب مع قاعدة البيانات في Laravel

يُعد إطار العمل Laravel من أكثر أُطُر تطوير تطبيقات الويب شيوعاً في عالم PHP، لما يتميز به من سهولة ومرونة في التعامل مع قواعد البيانات، وتوفير مجموعة أدوات متقدمة لتسهيل عملية بناء الاستعلامات (queries) بأسلوب برمجي أنيق وفعال. من أبرز هذه الأدوات هو منشئ الاستعلامات أو ما يُعرف بـ Query Builder، وهو عبارة عن واجهة برمجية تتيح للمطورين كتابة استعلامات قواعد البيانات بطريقة برمجية سهلة بدلاً من كتابة استعلامات SQL مباشرة.

تعريف منشئ الاستعلامات (Query Builder) في Laravel

منشئ الاستعلامات هو مكوّن يسمح بالتعامل مع قواعد البيانات باستخدام أساليب برمجية تعتمد على استدعاء الدوال بدلاً من صياغة أوامر SQL مباشرة، مما يعزز من قابلية الصيانة، ويوفر حماية ضد هجمات الحقن (SQL Injection) عن طريق الربط الآمن للمعاملات.

يمكن استخدام Query Builder للتعامل مع كافة عمليات CRUD (الإنشاء، القراءة، التحديث، الحذف)، وكذلك تنفيذ استعلامات معقدة، ترتيب النتائج، تجميع البيانات، والربط بين الجداول المختلفة.

المزايا الأساسية لاستخدام Query Builder

  • سهولة الاستخدام: كتابة استعلامات معقدة بصياغة برمجية بسيطة.

  • حماية ضد هجمات SQL Injection: يتم ربط البيانات بطريقة آمنة تلقائياً.

  • قابلية التوسعة والصيانة: كتابة كود أكثر تنظيماً وسهل القراءة.

  • دعم أنواع قواعد بيانات متعددة: مثل MySQL، PostgreSQL، SQLite، وSQL Server.

  • تكامل مع نظام الهجرات (Migrations): لضمان توافق قواعد البيانات مع الكود.

كيفية البدء باستخدام Query Builder في Laravel

لا يتطلب استخدام منشئ الاستعلامات إعدادات خاصة؛ فقط تكفي استدعاء الواجهة DB التي توفرها Laravel، عبر استخدام الـ Facade الخاص بها.

php
use Illuminate\Support\Facades\DB;

بعد ذلك يمكن بدء كتابة الاستعلامات مباشرة.


استعلامات القراءة باستخدام Query Builder

استعلامات استرجاع البيانات

للحصول على كافة الصفوف من جدول معين يمكن استخدام الدالة table لتحديد الجدول، ثم استدعاء الدالة get():

php
$users = DB::table('users')->get();

هذه العملية ترجع مجموعة من الكائنات (Collection) تحتوي على كل السجلات.

استعلام استرجاع صف واحد

إذا كنت تحتاج لسجل واحد فقط، يمكن استخدام first():

php
$user = DB::table('users')->where('id', 1)->first();

اختيار أعمدة معينة

يمكن تحديد أعمدة محددة باستخدام دالة select:

php
$names = DB::table('users')->select('name', 'email')->get();

استعلامات البحث

يمكن التصفية باستخدام where بأكثر من شكل:

php
$activeUsers = DB::table('users') ->where('status', 'active') ->get();

تدعم where المقارنة بعدة عوامل مثل =, <, >, <=, >=, != وغيرها.

استخدام شروط متعددة

يمكن إضافة شروط متعددة متتالية:

php
$users = DB::table('users') ->where('status', 'active') ->where('age', '>', 18) ->get();

استخدام أو (OR) في الشروط

يمكن استخدام orWhere لربط شروط بدلالة "أو":

php
$users = DB::table('users') ->where('status', 'active') ->orWhere('age', '<', 18) ->get();

استعلامات بحث نصية

يمكن استخدام whereLike أو where مع عامل like للبحث الجزئي:

php
$users = DB::table('users') ->where('name', 'like', '%ahmed%') ->get();

عمليات الترتيب والتجميع

ترتيب النتائج

يمكن ترتيب النتائج تصاعدياً أو تنازلياً:

php
$users = DB::table('users') ->orderBy('created_at', 'desc') ->get();

التحديد والحد من عدد النتائج

يمكن تحديد عدد النتائج باستخدام limit:

php
$latestUsers = DB::table('users') ->orderBy('created_at', 'desc') ->limit(10) ->get();

تجميع البيانات (Aggregate functions)

يدعم منشئ الاستعلامات عدة دوال للتجميع، مثل count, max, min, avg, و sum.

  • حساب عدد السجلات:

php
$count = DB::table('users')->count();
  • حساب مجموع عمود معين:

php
$totalSales = DB::table('orders')->sum('amount');
  • إيجاد أعلى قيمة:

php
$maxPrice = DB::table('products')->max('price');

عمليات الإدخال والتعديل والحذف باستخدام Query Builder

إدخال بيانات جديدة

يمكن إضافة سجل جديد باستخدام insert:

php
DB::table('users')->insert([ 'name' => 'Ali', 'email' => '[email protected]', 'password' => bcrypt('secret') ]);

لإضافة سجل مع استرجاع المعرف الخاص به، يستخدم insertGetId:

php
$id = DB::table('users')->insertGetId([ 'name' => 'Sara', 'email' => '[email protected]', 'password' => bcrypt('secret') ]);

تعديل بيانات موجودة

يمكن تعديل السجلات باستخدام update مع شرط where:

php
DB::table('users') ->where('id', 1) ->update(['email' => '[email protected]']);

حذف سجلات

لحذف سجل معين:

php
DB::table('users') ->where('id', 1) ->delete();

لحذف كل السجلات في جدول:

php
DB::table('users')->delete();

التعامل مع الربط بين الجداول (Joins)

يُعد الربط بين الجداول من الوظائف الهامة في قواعد البيانات العلائقية، ويدعم منشئ الاستعلامات عدة أنواع من الربط.

ربط داخلي (Inner Join)

مثلاً ربط جدول المستخدمين مع جدول المنشورات:

php
$posts = DB::table('users') ->join('posts', 'users.id', '=', 'posts.user_id') ->select('users.name', 'posts.title', 'posts.body') ->get();

ربط خارجي يساري (Left Join)

جلب كل المستخدمين مع منشوراتهم (إن وجدت):

php
$posts = DB::table('users') ->leftJoin('posts', 'users.id', '=', 'posts.user_id') ->select('users.name', 'posts.title') ->get();

ربط خارجي يميني (Right Join)

php
$posts = DB::table('users') ->rightJoin('posts', 'users.id', '=', 'posts.user_id') ->select('users.name', 'posts.title') ->get();

الاستعلامات المعقدة والمجمعة

استخدام التجميع مع الشرط

مثلاً، حساب عدد المنشورات لكل مستخدم:

php
$users = DB::table('users') ->join('posts', 'users.id', '=', 'posts.user_id') ->select('users.name', DB::raw('count(posts.id) as post_count')) ->groupBy('users.name') ->get();

استخدام الاستعلامات الفرعية (Subqueries)

مثال لاستعلام فرعي:

php
$users = DB::table('users') ->whereIn('id', function($query) { $query->select('user_id') ->from('posts') ->where('created_at', '>', now()->subMonth()); }) ->get();

التعامل مع الصفوف المكررة والبحث حسب الفترات الزمنية

جلب السجلات الفريدة

php
$emails = DB::table('users')->distinct()->get(['email']);

البحث حسب التواريخ

مثلاً جلب السجلات التي تم إنشاؤها خلال آخر أسبوع:

php
$recentUsers = DB::table('users') ->where('created_at', '>=', now()->subWeek()) ->get();

التعامل مع حالات أخرى متقدمة في Query Builder

تحديث أو إدخال (Upsert)

في Laravel 8 وما بعدها، يمكن استخدام دالة upsert لإدخال أو تحديث تلقائي:

php
DB::table('users')->upsert([ ['email' => '[email protected]', 'name' => 'Ali', 'age' => 30], ['email' => '[email protected]', 'name' => 'Sara', 'age' => 25] ], ['email'], ['name', 'age']);

التعامل مع الحقول JSON

يمكن استعلام وتحديث الحقول التي تحتوي على JSON:

php
$users = DB::table('users') ->where('options->enabled', true) ->get();

تحسين الأداء في Query Builder

استخدام الفهرسة (Indexing)

ينصح دائماً بإنشاء الفهارس على الأعمدة التي يتم البحث أو الربط عليها باستمرار لزيادة سرعة الاستعلامات.

تجنب جلب البيانات الزائدة

باستخدام دوال select و limit لتحديد الأعمدة وعدد النتائج المطلوبة.

الكاش المؤقت (Caching)

يمكن تخزين نتائج الاستعلامات المتكررة في الكاش لتقليل الضغط على قاعدة البيانات.


مثال عملي متكامل

php
$recentActiveUsersWithPosts = DB::table('users') ->join('posts', 'users.id', '=', 'posts.user_id') ->where('users.status', 'active') ->where('posts.created_at', '>=', now()->subMonth()) ->select('users.name', 'users.email', DB::raw('count(posts.id) as posts_count')) ->groupBy('users.id', 'users.name', 'users.email') ->orderBy('posts_count', 'desc') ->get();

هذا الاستعلام يقوم بجلب المستخدمين النشطين الذين نشروا منشورات في الشهر الأخير مع عدد منشوراتهم مرتبة تنازلياً.


خلاصة

منشئ الاستعلامات (Query Builder) في Laravel هو أداة قوية ومرنة تسهل عملية التخاطب مع قواعد البيانات بشكل آمن وفعال. يتيح للمطور كتابة استعلامات معقدة بمرونة عالية دون الحاجة للتعامل المباشر مع SQL، مما يسرع من تطوير التطبيقات ويحسن من جودة الكود. يدعم كافة عمليات الإدخال، التحديث، الحذف، والاستعلام بجميع أشكاله، كما يتكامل بسلاسة مع باقي مكونات Laravel مثل Eloquent و Migrations.

بالاعتماد على Query Builder، يمكن للمطورين التركيز على منطق التطبيق دون القلق بشأن تفاصيل التنفيذ الدقيقة في قاعدة البيانات، مع الحفاظ على أداء مرتفع ومستوى أمان عالٍ. ولهذا السبب، يعتبر منشئ الاستعلامات حجر الزاوية في التعامل مع قواعد البيانات ضمن مشاريع Laravel.


المراجع: