نسخه:

پایگاه داده: Query Builder

معرفی

سازنده پرس و جو پایگاه داده لاراول یک رابط راحت و روان برای ایجاد و اجرای پرس و جوهای پایگاه داده ارائه می دهد. می توان از آن برای انجام بیشتر عملیات پایگاه داده در برنامه کاربردی خود استفاده کرد و روی همه سیستم های پایگاه داده پشتیبانی شده کار می کند.

سازنده پرس و جو لاراول از اتصال پارامتر PDO برای محافظت از برنامه شما در برابر حملات تزریق SQL استفاده می کند. نیازی به تمیز کردن رشته‌هایی که به عنوان پابند منتقل می‌شوند وجود ندارد.

PDO از نام ستون های الزام آور پشتیبانی نمی کند. بنابراین، هرگز نباید به ورودی کاربر اجازه دهید نام ستون‌های ارجاع‌شده توسط پرس‌و‌جوهای شما، از جمله ستون‌های «ترتیب بر اساس» و غیره را تعیین کند. اگر باید به کاربر اجازه دهید ستون‌های خاصی را برای پرس‌وجو انتخاب کند، همیشه نام ستون‌ها را در مقابل علامت سفید تأیید کنید. لیست ستون های مجاز

بازیابی نتایج

بازیابی همه سطرها از یک جدول

برای شروع یک پرس و جو می توانید از table روش روی نما استفاده کنید. DB این table متد یک نمونه سازنده پرس و جو روان را برای جدول داده شده برمی گرداند، و به شما امکان می دهد محدودیت های بیشتری را به پرس و جو متصل کنید و در نهایت نتایج را با استفاده از get روش دریافت کنید:

<?php
 
namespace App\Http\Controllers;
 
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
 
class UserController extends Controller
{
/**
* Show a list of all of the application's users.
*
* @return Response
*/
public function index()
{
$users = DB::table('users')->get();
 
return view('user.index', ['users' => $users]);
}
}

این get روش Illuminate\Support\Collection حاوی نتایجی است که در آن هر نتیجه نمونه ای از stdClass شی PHP است. شما می توانید با دسترسی به ستون به عنوان ویژگی شی به مقدار هر ستون دسترسی پیدا کنید:

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');

برای بازیابی یک سطر با id مقدار ستون آن، از find روش زیر استفاده کنید:

$user = DB::table('users')->find(3);

بازیابی لیستی از مقادیر ستون

اگر می خواهید مجموعه ای حاوی مقادیر یک ستون را بازیابی کنید، می توانید از این pluck روش استفاده کنید. در این مثال، مجموعه ای از عناوین نقش ها را بازیابی می کنیم:

$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;
}

نتایج تکه تکه شدن

اگر نیاز به کار با هزاران رکورد پایگاه داده دارید، از 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) {
// Process the records...
 
return false;
});

اگر در حال به روز رسانی سوابق پایگاه داده در حین تجزیه نتایج هستید، نتایج تکه شما ممکن است به روش های غیرمنتظره ای تغییر کند. بنابراین، هنگام به روز رسانی رکوردها در حین تکه تکه شدن، همیشه بهترین کار این است که chunkById به جای آن از روش استفاده کنید. این روش به طور خودکار نتایج را بر اساس کلید اصلی رکورد صفحه بندی می کند:

DB::table('users')->where('active', false)
->chunkById(100, function ($users) {
foreach ($users as $user) {
DB::table('users')
->where('id', $user->id)
->update(['active' => true]);
}
});

هنگام به‌روزرسانی یا حذف سوابق درون پاسخ به تماس قطعه، هرگونه تغییر در کلید اصلی یا کلیدهای خارجی می‌تواند بر جستار قطعه تأثیر بگذارد. این به طور بالقوه می تواند منجر به عدم گنجاندن رکوردها در نتایج تکه تکه شود.

مصالح

سازنده پرس و جو همچنین انواع مختلفی از متدهای انبوه مانند 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');

تعیین اینکه آیا سوابق وجود دارد

به جای استفاده از count روش برای تعیین اینکه آیا رکوردهایی وجود دارد که با محدودیت های پرس و جو شما مطابقت دارد یا خیر، می توانید از روش exists و استفاده کنید: doesntExist

return DB::table('orders')->where('finalized', 1)->exists();
 
return DB::table('orders')->where('finalized', 1)->doesntExist();

انتخاب می کند

تعیین یک بند انتخاب

ممکن است همیشه نخواهید همه ستون ها را از جدول پایگاه داده انتخاب کنید. با استفاده از select متد، می توانید یک select عبارت سفارشی برای پرس و جو تعیین کنید:

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

این distinct متد به شما اجازه می‌دهد تا پرس و جو را مجبور کنید تا نتایج متمایز را برگرداند:

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

اگر قبلاً یک نمونه سازنده کوئری دارید و می‌خواهید یک ستون به عبارت انتخابی موجود آن اضافه کنید، می‌توانید از addSelect روش استفاده کنید:

$query = DB::table('users')->select('name');
 
$users = $query->addSelect('age')->get();

عبارات خام

گاهی اوقات ممکن است لازم باشد از یک عبارت خام در یک پرس و جو استفاده کنید. برای ایجاد یک عبارت خام، می توانید از DB::raw روش زیر استفاده کنید:

$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();

دستورات خام به صورت رشته ای به پرس و جو تزریق می شوند، بنابراین باید بسیار مراقب باشید که آسیب پذیری تزریق SQL ایجاد نکنید.

روش های خام

به جای استفاده از DB::raw ، می توانید از روش های زیر نیز برای درج یک عبارت خام در بخش های مختلف درخواست خود استفاده کنید.

selectRaw

روش selectRaw را می توان به جای استفاده کرد addSelect(DB::raw(...)) . این متد یک آرایه اختیاری از اتصالات را به عنوان آرگومان دوم خود می پذیرد:

$orders = DB::table('orders')
->selectRaw('price * ? as price_with_tax', [1.0825])
->get();

whereRaw / orWhereRaw

از whereRaw و orWhereRaw متدها می توان برای تزریق یک where بند خام به درخواست شما استفاده کرد. این متدها یک آرایه اختیاری از اتصالات را به عنوان آرگومان دوم خود می پذیرند:

$orders = DB::table('orders')
->whereRaw('price > IF(state = "TX", ?, 100)', [200])
->get();

havingRaw / orHavingRaw

متدهای havingRaw و orHavingRaw ممکن است برای تنظیم یک رشته خام به عنوان مقدار عبارت استفاده شوند having . این متدها یک آرایه اختیاری از اتصالات را به عنوان آرگومان دوم خود می پذیرند:

$orders = DB::table('orders')
->select('department', DB::raw('SUM(price) as total_sales'))
->groupBy('department')
->havingRaw('SUM(price) > ?', [2500])
->get();

orderByRaw

این orderByRaw روش ممکن است برای تنظیم یک رشته خام به عنوان مقدار عبارت استفاده شود order by :

$orders = DB::table('orders')
->orderByRaw('updated_at - created_at DESC')
->get();

groupByRaw

این groupByRaw روش ممکن است برای تنظیم یک رشته خام به عنوان مقدار عبارت استفاده شود group by :

$orders = DB::table('orders')
->select('city', 'state')
->groupByRaw('city, state')
->get();

می پیوندد

بند پیوستن داخلی

همچنین می‌توان از سازنده پرس و جو برای نوشتن عبارات پیوستن استفاده کرد. برای انجام یک "اتصال داخلی" اساسی، می توانید از این join روش در یک نمونه سازنده کوئری استفاده کنید. اولین آرگومان ارسال شده به join متد، نام جدولی است که باید به آن بپیوندید، در حالی که آرگومان های باقی مانده، محدودیت های ستون را برای اتصال مشخص می کنند. حتی می توانید در یک پرس و جو به چندین جدول بپیوندید:

$users = DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->get();

بند پیوستن چپ / راست عضویت

اگر می‌خواهید به جای «پیوستن درونی» یک «پیوستن چپ» یا «پیوستن راست» انجام دهید، از روش‌های leftJoin یا استفاده کنید rightJoin . این متدها دارای امضای یکسانی با join متد هستند:

$users = DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
 
$users = DB::table('users')
->rightJoin('posts', 'users.id', '=', 'posts.user_id')
->get();

بند عضویت متقاطع

برای انجام یک "پیوستن متقاطع" از crossJoin روش با نام جدولی که می‌خواهید به آن متصل شوید، استفاده کنید. اتصالات متقاطع یک محصول دکارتی بین جدول اول و جدول متصل ایجاد می کند:

$sizes = DB::table('sizes')
->crossJoin('colors')
->get();

بندهای عضویت پیشرفته

همچنین می توانید بندهای پیوستن پیشرفته تری را مشخص کنید. برای شروع، a را Closure به عنوان آرگومان دوم در join متد ارسال کنید. یک شی Closure دریافت می کند JoinClause که به شما امکان می دهد محدودیت هایی را در عبارت مشخص کنید join :

DB::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')->orOn(...);
})
->get();

اگر می‌خواهید از یک عبارت «where» در پیوندهای خود استفاده کنید، می‌توانید از متدهای where و orWhere در پیوند استفاده کنید. به جای مقایسه دو ستون، این روش ها ستون را با یک مقدار مقایسه می کنند:

DB::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')
->where('contacts.user_id', '>', 5);
})
->get();

Subquery Joins

می توانید از روش های joinSub , leftJoinSub و rightJoinSub برای پیوستن یک پرس و جو به یک پرسش فرعی استفاده کنید. هر یک از این روش‌ها سه آرگومان دریافت می‌کنند: پرس و جو فرعی، نام مستعار جدول آن، و یک Closure که ستون‌های مرتبط را تعریف می‌کند:

$latestPosts = DB::table('posts')
->select('user_id', DB::raw('MAX(created_at) as last_post_created_at'))
->where('is_published', true)
->groupBy('user_id');
 
$users = DB::table('users')
->joinSub($latestPosts, 'latest_posts', function ($join) {
$join->on('users.id', '=', 'latest_posts.user_id');
})->get();

اتحادیه ها

سازنده پرس و جو همچنین یک راه سریع برای "اتحاد" دو پرس و جو با هم ارائه می دهد. به عنوان مثال، می توانید یک پرس و جو اولیه ایجاد کنید و از union روش برای اتحاد آن با یک پرس و جو دوم استفاده کنید:

$first = DB::table('users')
->whereNull('first_name');
 
$users = DB::table('users')
->whereNull('last_name')
->union($first)
->get();

این unionAll روش نیز موجود است و دارای همان امضای متد است union .

که در آن بندها

بند های ساده Where

می‌توانید از این where روش در یک نمونه سازنده پرس و جو برای افزودن where بندهایی به پرس و جو استفاده کنید. ابتدایی ترین فراخوانی به where سه آرگومان نیاز دارد. اولین آرگومان نام ستون است. آرگومان دوم یک عملگر است که می تواند هر یک از عملگرهای پشتیبانی شده پایگاه داده باشد. در نهایت، آرگومان سوم مقداری است که باید در مقابل ستون ارزیابی شود.

به عنوان مثال، در اینجا یک پرس و جو وجود دارد که تأیید می کند مقدار ستون "votes" برابر با 100 است:

$users = DB::table('users')->where('votes', '=', 100)->get();

برای راحتی، اگر می خواهید بررسی کنید که یک ستون با یک مقدار داده شده برابر است، می توانید مقدار را مستقیماً به عنوان آرگومان دوم به متد ارسال کنید where :

$users = DB::table('users')->where('votes', 100)->get();

هنگام نوشتن یک بند می توانید از انواع عملگرهای دیگر استفاده کنید where :

$users = DB::table('users')
->where('votes', '>=', 100)
->get();
 
$users = DB::table('users')
->where('votes', '<>', 100)
->get();
 
$users = DB::table('users')
->where('name', 'like', 'T%')
->get();

همچنین می توانید یک آرایه از شرایط را به where تابع ارسال کنید:

$users = DB::table('users')->where([
['status', '=', '1'],
['subscribed', '<>', '1'],
])->get();

یا بیانیه ها

می‌توانید مکان‌هایی را که محدودیت‌ها را با هم زنجیره‌ای کنید و همچنین or بندهایی را به پرس و جو اضافه کنید. متد orWhere همان آرگومان های where متد را می پذیرد:

$users = DB::table('users')
->where('votes', '>', 100)
->orWhere('name', 'John')
->get();

اگر نیاز دارید یک شرط "یا" را در داخل پرانتز گروه بندی کنید، می توانید یک Closure را به عنوان اولین آرگومان به orWhere متد ارسال کنید:

$users = DB::table('users')
->where('votes', '>', 100)
->orWhere(function($query) {
$query->where('name', 'Abigail')
->where('votes', '>', 50);
})
->get();
 
// SQL: select * from users where votes > 100 or (name = 'Abigail' and votes > 50)

بند های اضافی Where

WhereBetween / یاWhereBetween

این whereBetween روش تأیید می کند که مقدار یک ستون بین دو مقدار است:

$users = DB::table('users')
->whereBetween('votes', [1, 100])
->get();

WhereNotBetween / یاWhereNotBetween

این whereNotBetween روش تأیید می کند که مقدار یک ستون خارج از دو مقدار است:

$users = DB::table('users')
->whereNotBetween('votes', [1, 100])
->get();

WhereIn / WhereNotIn / یاWhereIn / یاWhereNotIn

این whereIn روش تأیید می کند که مقدار یک ستون معین در آرایه داده شده وجود دارد:

$users = DB::table('users')
->whereIn('id', [1, 2, 3])
->get();

این whereNotIn روش تأیید می کند که مقدار ستون داده شده در آرایه داده شده وجود ندارد :

$users = DB::table('users')
->whereNotIn('id', [1, 2, 3])
->get();

اگر آرایه عظیمی از اتصالات اعداد صحیح را به درخواست خود اضافه می کنید، ممکن است از روش های whereIntegerInRaw یا whereIntegerNotInRaw برای کاهش بسیار زیاد استفاده از حافظه شما استفاده شود.

whereNull / whereNotNull / یاWhereNull / یاWhereNotNull

این whereNull روش تأیید می کند که مقدار ستون داده شده عبارت است از NULL :

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

این whereNotNull روش تأیید می کند که مقدار ستون این نیست NULL :

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

WhereDate / WhereMonth / WhereDay / WhereYear / WhereTime

این whereDate روش ممکن است برای مقایسه مقدار یک ستون با یک تاریخ استفاده شود:

$users = DB::table('users')
->whereDate('created_at', '2016-12-31')
->get();

این whereMonth روش ممکن است برای مقایسه مقدار یک ستون با یک ماه خاص از یک سال استفاده شود:

$users = DB::table('users')
->whereMonth('created_at', '12')
->get();

این whereDay روش ممکن است برای مقایسه مقدار یک ستون با یک روز خاص از یک ماه استفاده شود:

$users = DB::table('users')
->whereDay('created_at', '31')
->get();

این whereYear روش ممکن است برای مقایسه مقدار یک ستون با یک سال خاص استفاده شود:

$users = DB::table('users')
->whereYear('created_at', '2016')
->get();

این whereTime روش ممکن است برای مقایسه مقدار یک ستون با یک زمان خاص استفاده شود:

$users = DB::table('users')
->whereTime('created_at', '=', '11:20:45')
->get();

WhereColumn / یاWhereColumn

این whereColumn روش ممکن است برای تأیید مساوی بودن دو ستون استفاده شود:

$users = DB::table('users')
->whereColumn('first_name', 'last_name')
->get();

همچنین می توانید یک عملگر مقایسه را به متد ارسال کنید:

$users = DB::table('users')
->whereColumn('updated_at', '>', 'created_at')
->get();

این whereColumn روش همچنین می‌تواند به آرایه‌ای از شرایط متعدد منتقل شود. این شرایط با استفاده از اپراتور ملحق خواهند شد and :

$users = DB::table('users')
->whereColumn([
['first_name', '=', 'last_name'],
['updated_at', '>', 'created_at'],
])->get();

گروه بندی پارامترها

گاهی اوقات ممکن است نیاز داشته باشید که در آن عبارات پیشرفته تری مانند عبارت «where exists» یا گروه بندی پارامترهای تودرتو ایجاد کنید. سازنده پرس و جو لاراول می تواند این موارد را نیز مدیریت کند. برای شروع، به مثالی از گروه بندی محدودیت ها در داخل پرانتز نگاه می کنیم:

$users = DB::table('users')
->where('name', '=', 'John')
->where(function ($query) {
$query->where('votes', '>', 100)
->orWhere('title', '=', 'Admin');
})
->get();

همانطور که می بینید، ارسال a Closure به where متد به سازنده query دستور می دهد تا یک گروه محدودیت را شروع کند. یک Closure نمونه سازنده پرس و جو دریافت می کند که می توانید از آن برای تنظیم محدودیت هایی که باید در گروه پرانتز وجود داشته باشد استفاده کنید. مثال بالا SQL زیر را تولید می کند:

select * from users where name = 'John' and (votes > 100 or title = 'Admin')

همیشه باید orWhere تماس‌ها را گروه‌بندی کنید تا از رفتار غیرمنتظره در هنگام اعمال دامنه‌های جهانی جلوگیری کنید.

مواردی که وجود دارد

این متد به شما اجازه می دهد تا بندهای SQL whereExists بنویسید . where exists این whereExists متد یک Closure آرگومان را می پذیرد، که یک نمونه سازنده پرس و جو را دریافت می کند که به شما امکان می دهد پرس و جوی را که باید در داخل عبارت "exists" قرار گیرد را تعریف کنید:

$users = DB::table('users')
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('orders')
->whereRaw('orders.user_id = users.id');
})
->get();

کوئری بالا SQL زیر را تولید می کند:

select * from users
where exists (
select 1 from orders where orders.user_id = users.id
)

عبارت های فرعی کجا

گاهی اوقات ممکن است نیاز داشته باشید که یک عبارت Where بسازید که نتایج یک پرس و جو فرعی را با یک مقدار معین مقایسه کند. شما می توانید این کار را با ارسال یک Closure و یک مقدار به where متد انجام دهید. به عنوان مثال، پرس و جوی زیر تمام کاربرانی را که اخیراً «عضویت» از یک نوع معین دارند، بازیابی می کند.

use App\User;
 
$users = User::where(function ($query) {
$query->select('type')
->from('membership')
->whereColumn('user_id', 'users.id')
->orderByDesc('start_date')
->limit(1);
}, 'Pro')->get();

JSON Where Clauses

لاراول همچنین از انواع ستون‌های JSON در پایگاه‌های داده که از انواع ستون‌های JSON پشتیبانی می‌کنند، پشتیبانی می‌کند. در حال حاضر، این شامل MySQL 5.7، PostgreSQL، SQL Server 2016، و SQLite 3.9.0 (با پسوند JSON1 ) است. برای پرس و جو از یک ستون JSON، از -> عملگر استفاده کنید:

$users = DB::table('users')
->where('options->language', 'en')
->get();
 
$users = DB::table('users')
->where('preferences->dining->meal', 'salad')
->get();

می توانید whereJsonContains برای پرس و جو از آرایه های JSON (در SQLite پشتیبانی نمی شود):

$users = DB::table('users')
->whereJsonContains('options->languages', 'en')
->get();

پشتیبانی MySQL و PostgreSQL whereJsonContains با چندین مقدار:

$users = DB::table('users')
->whereJsonContains('options->languages', ['en', 'de'])
->get();

شما می توانید whereJsonLength برای پرس و جو از آرایه های JSON بر اساس طول آنها استفاده کنید:

$users = DB::table('users')
->whereJsonLength('options->languages', 0)
->get();
 
$users = DB::table('users')
->whereJsonLength('options->languages', '>', 1)
->get();

سفارش، گروه بندی، محدودیت و افست

سفارش توسط

این orderBy روش به شما اجازه می دهد تا نتیجه پرس و جو را بر اساس یک ستون مشخص مرتب کنید. آرگومان اول متد orderBy باید ستونی باشد که می خواهید بر اساس آن مرتب کنید، در حالی که آرگومان دوم جهت مرتب سازی را کنترل می کند و ممکن است یکی asc یا desc :

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

اگر نیاز به مرتب سازی بر اساس چندین ستون دارید، می توانید orderBy هر چند بار که لازم است فراخوانی کنید:

$users = DB::table('users')
->orderBy('name', 'desc')
->orderBy('email', 'asc')
->get();

جدیدترین / قدیمی ترین

و متدها به شما امکان latest می oldest دهند به راحتی نتایج را بر اساس تاریخ سفارش دهید. به طور پیش فرض، نتیجه توسط ستون مرتب می شود created_at . یا می‌توانید نام ستونی را که می‌خواهید بر اساس آن مرتب کنید، ارسال کنید:

$user = DB::table('users')
->latest()
->first();

inRandomOrder

این inRandomOrder روش ممکن است برای مرتب کردن نتایج پرس و جو به صورت تصادفی استفاده شود. به عنوان مثال، می توانید از این روش برای واکشی یک کاربر تصادفی استفاده کنید:

$randomUser = DB::table('users')
->inRandomOrder()
->first();

دوباره سفارش دهید

این reorder روش به شما امکان می دهد تمام سفارش های موجود را حذف کرده و به صورت اختیاری یک سفارش جدید اعمال کنید. به عنوان مثال، می توانید تمام سفارشات موجود را حذف کنید:

$query = DB::table('users')->orderBy('name');
 
$unorderedUsers = $query->reorder()->get();

برای حذف تمام سفارش‌های موجود و اعمال یک سفارش جدید، ستون و جهت را به عنوان آرگومان‌های متد ارائه کنید:

$query = DB::table('users')->orderBy('name');
 
$usersOrderedByEmail = $query->reorder('email', 'desc')->get();

groupBy / داشتن

ممکن است از روش groupBy و having برای گروه بندی نتایج پرس و جو استفاده شود. امضای having متد مشابه امضای متد است where :

$users = DB::table('users')
->groupBy('account_id')
->having('account_id', '>', 100)
->get();

می توانید چندین آرگومان را به groupBy متد ارسال کنید تا بر اساس چندین ستون گروه بندی شود:

$users = DB::table('users')
->groupBy('first_name', 'status')
->having('account_id', '>', 100)
->get();

having برای عبارات پیشرفته تر ، havingRaw روش را ببینید.

جست و خیز / گرفتن

برای محدود کردن تعداد نتایج برگردانده شده از پرس و جو، یا رد کردن تعداد معینی از نتایج در پرس و جو، می توانید از روش skip و استفاده کنید: take

$users = DB::table('users')->skip(10)->take(5)->get();

به طور متناوب، می توانید از روش های limit و استفاده کنید offset :

$users = DB::table('users')
->offset(10)
->limit(5)
->get();

عبارت های شرطی

گاهی اوقات ممکن است بخواهید که بندها فقط زمانی برای یک پرس و جو اعمال شوند که چیز دیگری درست باشد. به عنوان مثال، شما ممکن است فقط بخواهید یک where دستور را اعمال کنید که یک مقدار ورودی داده شده در درخواست ورودی وجود داشته باشد. شما می توانید این کار را با استفاده از when روش زیر انجام دهید:

$role = $request->input('role');
 
$users = DB::table('users')
->when($role, function ($query, $role) {
return $query->where('role_id', $role);
})
->get();

این when روش فقط زمانی بسته شدن داده شده را اجرا می کند که اولین پارامتر باشد true . اگر پارامتر اول باشد false ، Closure اجرا نخواهد شد.

می توانید یک Closure دیگر را به عنوان پارامتر سوم به when متد ارسال کنید. اگر پارامتر اول به عنوان ارزیابی شود، این بسته اجرا می شود false . برای نشان دادن نحوه استفاده از این ویژگی، از آن برای پیکربندی مرتب‌سازی پیش‌فرض یک پرس و جو استفاده می‌کنیم:

$sortBy = null;
 
$users = DB::table('users')
->when($sortBy, function ($query, $sortBy) {
return $query->orderBy($sortBy);
}, function ($query) {
return $query->orderBy('name');
})
->get();

درج می کند

سازنده پرس و جو همچنین insert روشی را برای درج رکوردها در جدول پایگاه داده ارائه می دهد. متد insert آرایه ای از نام ها و مقادیر ستون ها را می پذیرد:

DB::table('users')->insert(
['email' => 'john@example.com', 'votes' => 0]
);

حتی می توانید چندین رکورد را با یک فراخوانی insert با ارسال آرایه ای از آرایه ها در جدول وارد کنید. هر آرایه نشان دهنده یک ردیف است که باید در جدول درج شود:

DB::table('users')->insert([
['email' => 'taylor@example.com', 'votes' => 0],
['email' => 'dayle@example.com', 'votes' => 0],
]);

این insertOrIgnore روش هنگام درج رکوردها در پایگاه داده، خطاهای رکورد تکراری را نادیده می گیرد:

DB::table('users')->insertOrIgnore([
['id' => 1, 'email' => 'taylor@example.com'],
['id' => 2, 'email' => 'dayle@example.com'],
]);

افزایش خودکار شناسه ها

اگر جدول دارای شناسه افزایش خودکار است، از insertGetId روش برای درج یک رکورد و سپس بازیابی شناسه استفاده کنید:

$id = DB::table('users')->insertGetId(
['email' => 'john@example.com', 'votes' => 0]
);

هنگام استفاده از PostgreSQL، insertGetId متد انتظار دارد که ستون افزایش خودکار نامگذاری شود id . اگر می خواهید شناسه را از یک "توالی" دیگر بازیابی کنید، می توانید نام ستون را به عنوان پارامتر دوم به متد ارسال کنید insertGetId .

به روز رسانی ها

علاوه بر درج رکوردها در پایگاه داده، سازنده پرس و جو همچنین می تواند رکوردهای موجود را با استفاده از update روش به روز کند. این update روش، مانند insert متد، آرایه ای از جفت های ستون و مقادیر را می پذیرد که شامل ستون هایی است که باید به روز شوند. می توانید update پرس و جو را با استفاده از where بندها محدود کنید:

$affected = DB::table('users')
->where('id', 1)
->update(['votes' => 1]);

به روز رسانی یا درج کنید

گاهی اوقات ممکن است بخواهید یک رکورد موجود در پایگاه داده را به روز کنید یا در صورت عدم وجود رکورد منطبق، آن را ایجاد کنید. در این سناریو، updateOrInsert ممکن است از روش استفاده شود. این updateOrInsert روش دو آرگومان را می پذیرد: یک آرایه از شرایط برای یافتن رکورد، و یک آرایه از جفت های ستون و مقادیر حاوی ستون هایی که باید به روز شوند.

این updateOrInsert روش ابتدا سعی می کند یک رکورد پایگاه داده منطبق را با استفاده از جفت های ستون و مقدار آرگومان اول پیدا کند. اگر رکورد وجود داشته باشد، با مقادیر آرگومان دوم به روز می شود. اگر رکورد پیدا نشد، یک رکورد جدید با ویژگی های ادغام شده هر دو آرگومان درج می شود:

DB::table('users')
->updateOrInsert(
['email' => 'john@example.com', 'name' => 'John'],
['votes' => '2']
);

در حال به روز رسانی ستون های JSON

هنگام به روز رسانی یک ستون JSON، باید از -> syntax برای دسترسی به کلید مناسب در شی JSON استفاده کنید. این عملیات در MySQL 5.7+ و PostgreSQL 9.5+ پشتیبانی می‌شود:

$affected = DB::table('users')
->where('id', 1)
->update(['options->enabled' => true]);

افزایش و کاهش

سازنده پرس و جو همچنین روش های مناسبی را برای افزایش یا کاهش مقدار یک ستون مشخص ارائه می دهد. این یک میانبر است که در مقایسه با نوشتن دستی بیانیه، رابطی گویاتر و مختصرتر ارائه می دهد update .

هر دوی این روش ها حداقل یک آرگومان را می پذیرند: ستونی که باید اصلاح شود. آرگومان دوم ممکن است به صورت اختیاری برای کنترل مقداری که ستون باید افزایش یا کاهش یابد ارسال شود:

DB::table('users')->increment('votes');
 
DB::table('users')->increment('votes', 5);
 
DB::table('users')->decrement('votes');
 
DB::table('users')->decrement('votes', 5);

همچنین می توانید ستون های اضافی را برای به روز رسانی در طول عملیات مشخص کنید:

DB::table('users')->increment('votes', 1, ['name' => 'John']);

increment رویدادهای مدل هنگام استفاده از روش‌های و فعال نمی‌شوند decrement .

حذف می کند

همچنین ممکن است از سازنده پرس و جو برای حذف رکوردها از جدول از طریق delete متد استفاده شود. قبل از فراخوانی متد ، می‌توانید delete عبارات را با اضافه کردن عبارت‌ها محدود کنید : where delete

DB::table('users')->delete();
 
DB::table('users')->where('votes', '>', 100)->delete();

اگر می‌خواهید کل جدول را کوتاه کنید، که تمام ردیف‌ها را حذف می‌کند و شناسه افزایش خودکار را صفر می‌کند، می‌توانید از truncate روش زیر استفاده کنید:

DB::table('users')->truncate();

قفل بدبینانه

سازنده پرس و جو همچنین شامل چند عملکرد است که به شما کمک می کند "قفل بدبینانه" را در select اظهارات خود انجام دهید. برای اجرای عبارت با یک «قفل مشترک»، می‌توانید از این sharedLock روش در پرس و جو استفاده کنید. یک قفل مشترک از اصلاح ردیف های انتخابی تا زمانی که تراکنش شما متعهد شود جلوگیری می کند:

DB::table('users')->where('votes', '>', 100)->sharedLock()->get();

در غیر این صورت، می توانید از lockForUpdate روش استفاده کنید. قفل «برای به‌روزرسانی» از تغییر یا انتخاب ردیف‌ها با قفل مشترک دیگری جلوگیری می‌کند:

DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();

اشکال زدایی

می‌توانید هنگام ساخت پرس‌وجو از روش‌های dd یا برای حذف پیوندهای پرس و جو و SQL استفاده کنید. dump این dd روش اطلاعات اشکال زدایی را نمایش می دهد و سپس اجرای درخواست را متوقف می کند. این dump روش اطلاعات اشکال زدایی را نمایش می دهد اما به درخواست اجازه می دهد اجرا شود:

DB::table('users')->where('votes', '>', 100)->dd();
 
DB::table('users')->where('votes', '>', 100)->dump();