پایگاه داده: 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 userswhere 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();