Laravel/queries

من موسوعة حسوب
مراجعة 17:43، 18 أكتوبر 2018 بواسطة تسنيم-ولهازي (نقاش | مساهمات) (أنشأ الصفحة ب' = قواعد البيانات: منشئ الاستعلامات = == مقدمة == يوفّر منشئ استعلامات قاعدة بيانات Laravel واجهة م...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

قواعد البيانات: منشئ الاستعلامات

مقدمة

يوفّر منشئ استعلامات قاعدة بيانات 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();