Laravel/queries
قواعد البيانات: منشئ الاستعلامات
مقدمة
يوفّر منشئ استعلامات قاعدة بيانات Laravel واجهة ملائمة وسلسة لإنشاء وإدارة استعلامات قاعدة البيانات. يمكن استخدامه لتنفيذ معظم عمليات قاعدة البيانات بتطبيقك كما أنه يعمل على جميع أنظمة قواعد البيانات المدعومة.
يستخدم منشئ استعلامات Laravel ارتباط المعاملة PDO لحماية تطبيقك من هجمات حقن SQL. لا حاجة لتنظيف السلاسل النصيّة التي تُمرّر كارتباطات.
استرداد النتائج
استرداد جميع الصفوف من الجدول
تستطيع استخدام التابع table
على الواجهة الساكنة DB
لبدء استعلام. يرد التابع table
نسخة منشئ استعلامات فصيحة (fluent) للجدول المحدد، ممّا يسمح لك بربط المزيد من القيود بالاستعلام ثم الحصول على النتائج في النهاية باستخدام التابع get
:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* عرض قائمة كل مستخدمي التطبيق.
*
* @return Response
*/
public function index()
{
$users = DB::table('users')->get();
return view('user.index', ['users' => $users]);
}
}
يعيد التابع get
الملف Illuminate\Support\Collection
الذي يحتوي على النتائج بحيث تكون كل نتيجة نسخة من الكائن PHP StdClass
. تستطيع الوصول لقيمة كل عمود عن طريق الوصول للعمود كخاصية للكائن:
foreach ($users as $user) {
echo $user->name;
}
استرداد صف أو عمود مفرد من جدول
تستطيع استخدام التابع first
إن احتجت لاسترداد صف واحد فقط من جدول قاعدة البيانات. سيعيد هذا التابع كائن StdClass
واحد:
$user = DB::table('users')->where('name', 'John')->first();
echo $user->name;
تستطيع استخراج قيمة واحدة من سجلّ ما باستخدام التابع value
إن لم تحتج حتى لصفّ كامل. سيعيد هذا التابع قيمة العمود مباشرة:
$email = DB::table('users')->where('name', 'John')->value('email');
استرداد قائمة قيم الأعمدة
تستطيع استخدام التابع pluck
إن رغبت في استرداد مجموعة تحتوي على قيم عمود واحد. سنسترد في هذا المثال، مجموعة من عناوين الوظائف (roles):
$titles = DB::table('roles')->pluck('title');
foreach ($titles as $title) {
echo $title;
}
تستطيع أيضًا تحديد عمود مفاتيح مخصصّة للمجموعة المردودة:
$roles = DB::table('roles')->pluck('title', 'name');
foreach ($roles as $name => $title) {
echo $title;
}
تقسيم النتائج (Chunking Results)
من المُقترح استخدام التابع chunk
إن إحتجت للعمل مع الآلاف من سجلات قاعدة البيانات. يعيد هذا التابع جزءًا صغيرًا من النتائج كل مرّة ويعطي كل قطعة لنطاق مغلق Closure للمعالجة. هذا التابع مفيد جدًا في كتابة الأوامر Artisan التي تعالج آلاف السجلات. دعنا نعمل مثلًا مع الجدول users كاملًا لكن على أجزاء من 100 سجل في كل مرّة:
DB::table('users')->orderBy('id')->chunk(100, function ($users) {
foreach ($users as $user) {
//
}
});
تستطيع إيقاف معالجة قطع أخرى عبر رد القيمة false
من Closure:
DB::table('users')->orderBy('id')->chunk(100, function ($users) {
// عالج السجلات...
return false;
});
المجاميع
يوفّر منشئ الاستعلامات أيضًا مجموعة متنوعة من التوابع التجميعية (aggregate methods) مثل count
، و max
، و min
، و avg
، و sum
. تستطيع مناداة أي من هذه التوابع بعد إنشاء استعلامك:
$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
تستطيع طبعًا دمج هذه التوابع مع بنود أخرى:
$price = DB::table('orders')
->where('finalized', 1)
->avg('price');
تحديد ما إذا كانت السجلات موجودة
تستطيع استخدام الأساليب exists
و doesntExist
بدل استخدام التابع count
لتحديد ما إذا طابقت أية سجلات قيود استعلامك:
return DB::table('orders')->where('finalized', 1)->exists();
return DB::table('orders')->where('finalized', 1)->doesntExist();
معاملات عرض السجلّات Selects
تحديد بند Select
قد لا ترغب دائمًا طبعًا في تحديد (select) كافة الأعمدة من جدول قاعدة البيانات. تستطيع تحديد بند select مُخصّص للاستعلام باستخدام التابع select
:
$users = DB::table('users')->select('name', 'email as user_email')->get();