وقتی با Laravel کار میکنید، یکی از مهمترین بخشهای توسعه هر پروژه، ارتباط با دیتابیس و اجرای Queryهای مختلف است. تقریباً هر سیستم واقعی، از یک وبسایت ساده گرفته تا فروشگاه اینترنتی، CMS، پنل مدیریت یا API، به تعداد زیادی Query برای دریافت، ثبت، ویرایش و حذف اطلاعات نیاز دارد.
Laravel برای کار با دیتابیس روشهای مختلفی در اختیار توسعهدهنده قرار میدهد. یکی از مهمترین آنها Query Builder است.
Query Builder به شما اجازه میدهد بدون نوشتن مستقیم SQL خام، Queryهای دیتابیس را با استفاده از متدهای PHP و Laravel ایجاد و اجرا کنید.
در این مقاله از مجموعه آموزش Laravel، با Query Builder بهصورت کامل آشنا میشویم و نحوه استفاده از آن برای دریافت، فیلتر، مرتبسازی، اتصال جدولها، درج، ویرایش و حذف اطلاعات را بررسی میکنیم.
Query Builder در Laravel چیست؟
Query Builder یکی از امکانات Laravel برای ساخت و اجرای Queryهای دیتابیس است که یک رابط برنامهنویسی ساده و خوانا در اختیار شما قرار میدهد.
برای استفاده از Query Builder معمولاً از Facade مربوط به DB استفاده میکنیم:
use Illuminate\Support\Facades\DB;
سپس میتوانیم با DB::table() جدول موردنظر را انتخاب کنیم:
$users = DB::table('users')->get();
در این مثال، Laravel اطلاعات جدول users را دریافت میکند.
معادل تقریبی SQL این Query به شکل زیر است:
SELECT * FROM users;
تفاوت مهم این است که شما نیازی ندارید SQL را مستقیماً در کد PHP بنویسید.
چرا از Query Builder استفاده کنیم؟
در پروژههای Laravel معمولاً Eloquent انتخاب بسیار مناسبی برای کار با Modelها و Relationshipها است، اما همیشه قرار نیست همه Queryها را با Eloquent بنویسیم.
Query Builder در شرایط مختلف میتواند انتخاب مناسبی باشد.
برای مثال زمانی که:
- Query پیچیدهای دارید.
- چند جدول را با Join به یکدیگر متصل میکنید.
- به Model و قابلیتهای Eloquent نیاز ندارید.
- فقط چند ستون مشخص از دیتابیس را میخواهید.
- Queryهای گزارشگیری دارید.
- عملیات Aggregation انجام میدهید.
- میخواهید مستقیماً با ساختار جدولها کار کنید.
بنابراین Query Builder و Eloquent رقیب یکدیگر نیستند؛ هر دو ابزارهایی برای کار با دیتابیس هستند و بسته به نیاز پروژه میتوان از آنها استفاده کرد.
# شروع کار با Query Builder
ابتدا Facade مربوط به DB را وارد میکنیم:
use Illuminate\Support\Facades\DB;
حالا میتوانیم یک Query ایجاد کنیم:
$users = DB::table('users')->get();
متد table() جدول موردنظر را مشخص میکند.
مثلاً:
DB::table('products')
یعنی از جدول products استفاده کن.
# دریافت اطلاعات با Query Builder
استفاده از get()
اگر بخواهیم چندین رکورد را دریافت کنیم، میتوانیم از get() استفاده کنیم:
$users = DB::table('users')->get();
نتیجه یک Collection از رکوردها خواهد بود.
مثلاً:
foreach ($users as $user) {
echo $user->name;
}
دریافت اولین رکورد با first()
اگر فقط اولین نتیجه Query را نیاز داشته باشیم:
$user = DB::table('users')->first();
اگر هیچ رکوردی وجود نداشته باشد، نتیجه null خواهد بود.
مثلاً:
$user = DB::table('users')->first();
if ($user) {
echo $user->name;
}
دریافت یک مقدار مشخص با value()
اگر فقط مقدار یک ستون را نیاز داشته باشیم، value() کاربردی است:
$email = DB::table('users')
->where('id', 10)
->value('email');
در این حالت فقط مقدار email رکورد موردنظر برگردانده میشود.
این روش زمانی مفید است که به کل رکورد نیاز نداریم.
دریافت یک ستون با pluck()
اگر بخواهیم مقادیر یک ستون را دریافت کنیم:
$emails = DB::table('users')->pluck('email');
یا مثلاً:
$names = DB::table('users')->pluck('name');
این روش برای زمانی مناسب است که فقط به یک ستون خاص از چند رکورد نیاز داریم.
# انتخاب ستونهای مشخص با select()
بهصورت پیشفرض:
DB::table('users')->get();
تمام ستونها را دریافت میکند.
اما معمولاً بهتر است فقط ستونهایی را دریافت کنیم که واقعاً نیاز داریم:
$users = DB::table('users')
->select('id', 'name', 'email')
->get();
Query ایجادشده تقریباً مشابه این SQL است:
SELECT id, name, email FROM users;
این روش مخصوصاً در جدولهای بزرگ میتواند مفید باشد، چون نیازی نیست اطلاعات اضافی از دیتابیس دریافت شود.
استفاده از addSelect()
اگر بخواهیم بعداً ستون دیگری به Query اضافه کنیم:
$query = DB::table('users')
->select('id', 'name');
$query->addSelect('email');
$users = $query->get();
# شرطگذاری با where()
یکی از مهمترین متدهای Query Builder، where() است.
مثلاً:
$users = DB::table('users')
->where('status', 'active')
->get();
این Query فقط کاربران فعال را دریافت میکند.
معادل SQL:
SELECT * FROM users
WHERE status = 'active';
where با عملگرهای مختلف
میتوانیم عملگر مقایسه را نیز مشخص کنیم:
$products = DB::table('products')
->where('price', '>', 100000)
->get();
یا:
$products = DB::table('products')
->where('stock', '<=', 10)
->get();
فرمت کلی:
->where('column', 'operator', 'value')
مثلاً:
->where('age', '>=', 18)
# استفاده از چند where
میتوان چند شرط را پشت سر هم قرار داد:
$users = DB::table('users')
->where('status', 'active')
->where('age', '>=', 18)
->get();
در این حالت هر دو شرط باید برقرار باشند.
# استفاده از orWhere()
اگر بخواهیم بین شرایط از OR استفاده کنیم:
$users = DB::table('users')
->where('role', 'admin')
->orWhere('role', 'manager')
->get();
این Query مدیران و ادمینها را دریافت میکند.
# whereIn()
زمانی که مقدار یک ستون باید در بین چند مقدار مشخص باشد، whereIn() کاربرد دارد:
$users = DB::table('users')
->whereIn('id', [1, 2, 5, 8])
->get();
معادل مفهومی:
WHERE id IN (1, 2, 5, 8)
whereNotIn()
برای برعکس آن:
$users = DB::table('users')
->whereNotIn('id', [1, 2, 5])
->get();
# whereNull() و whereNotNull()
برای بررسی مقدارهای NULL:
$users = DB::table('users')
->whereNull('deleted_at')
->get();
برای مقدارهای غیر NULL:
$users = DB::table('users')
->whereNotNull('email_verified_at')
->get();
این روش مخصوصاً در جدولهایی که از Soft Delete استفاده میکنند بسیار رایج است.
# whereBetween()
برای بررسی اینکه مقدار یک ستون در یک محدوده قرار دارد:
$products = DB::table('products')
->whereBetween('price', [100000, 500000])
->get();
در این مثال محصولاتی که قیمت آنها بین 100 هزار تا 500 هزار است دریافت میشوند.
# مرتبسازی Query با orderBy()
برای مرتبسازی نتایج از orderBy() استفاده میکنیم:
$users = DB::table('users')
->orderBy('name', 'asc')
->get();
برای مرتبسازی نزولی:
$users = DB::table('users')
->orderBy('created_at', 'desc')
->get();
مقادیر رایج:
asc
desc
latest() و oldest()
برای مرتبسازی بر اساس تاریخ:
$users = DB::table('users')
->latest()
->get();
یا:
$users = DB::table('users')
->oldest()
->get();
اگر لازم باشد ستون دیگری را مشخص کنیم:
$users = DB::table('users')
->latest('updated_at')
->get();
# محدود کردن تعداد نتایج
گاهی نمیخواهیم تمام رکوردها را دریافت کنیم.
برای این کار میتوانیم از limit() استفاده کنیم:
$users = DB::table('users')
->limit(10)
->get();
همچنین:
->take(10)
نیز برای این نوع استفاده کاربرد دارد.
# skip() و offset()
برای رد کردن تعدادی از رکوردها:
$users = DB::table('users')
->skip(10)
->take(10)
->get();
این Query میتواند برای دریافت بخشی از نتایج استفاده شود.
البته برای پیادهسازی حرفهای Pagination، Laravel ابزار اختصاصی دارد که در مقاله بعدی این کلاستر بهصورت کامل بررسی خواهد شد.
# Insert در Query Builder
Query Builder فقط برای دریافت اطلاعات نیست و میتوان با آن اطلاعات جدید نیز وارد دیتابیس کرد.
مثلاً:
DB::table('users')->insert([
'name' => 'Ali',
'email' => 'ali@example.com',
'password' => bcrypt('password'),
]);
در این مثال یک رکورد جدید در جدول users ایجاد میشود.
درج چند رکورد همزمان
میتوان چند رکورد را با یک Query وارد کرد:
DB::table('users')->insert([
[
'name' => 'Ali',
'email' => 'ali@example.com',
],
[
'name' => 'Reza',
'email' => 'reza@example.com',
],
]);
این روش برای وارد کردن حجم زیادی از دادههای اولیه میتواند بسیار کاربردی باشد.
# insertGetId()
اگر بخواهیم ID رکورد جدید را دریافت کنیم:
$id = DB::table('users')->insertGetId([
'name' => 'Ali',
'email' => 'ali@example.com',
]);
حالا متغیر $id شناسه رکورد ایجادشده را در اختیار دارد.
# Update با Query Builder
برای ویرایش اطلاعات از update() استفاده میکنیم.
مثلاً:
DB::table('users')
->where('id', 10)
->update([
'name' => 'Ali Rezaei',
'status' => 'active',
]);
نکته بسیار مهم این است که قبل از update() معمولاً باید شرط مناسبی قرار دهید.
مثلاً این Query:
DB::table('users')->update([
'status' => 'active',
]);
ممکن است وضعیت تمام کاربران جدول را تغییر دهد.
بنابراین همیشه قبل از عملیات Update بررسی کنید که دقیقاً چه رکوردهایی قرار است تغییر کنند.
# افزایش و کاهش مقدار عددی
فرض کنید موجودی محصولی را در ستون stock نگهداری میکنیم.
برای افزایش مقدار:
DB::table('products')
->where('id', 10)
->increment('stock');
یا:
DB::table('products')
->where('id', 10)
->increment('stock', 5);
برای کاهش:
DB::table('products')
->where('id', 10)
->decrement('stock', 2);
این متدها برای موجودی، امتیاز، تعداد بازدید و موارد مشابه بسیار کاربردی هستند.
# Delete با Query Builder
برای حذف رکورد:
DB::table('users')
->where('id', 10)
->delete();
برای حذف تمام رکوردهایی که شرط خاصی دارند:
DB::table('users')
->where('status', 'inactive')
->delete();
و همانند update() باید در عملیات حذف دقت زیادی داشته باشید.
یک Query مانند:
DB::table('users')->delete();
میتواند تمام رکوردهای جدول را حذف کند.
# truncate()
اگر هدف حذف تمام دادههای جدول باشد، میتوان از:
DB::table('users')->truncate();
استفاده کرد.
این عملیات با حذف رکوردهای مشخص تفاوت دارد و باید با احتیاط استفاده شود.
# Join در Query Builder
یکی از نقاط قوت Query Builder، ساخت Queryهای چندجدولی است.
فرض کنید دو جدول داریم:
users
orders
و جدول orders دارای user_id است.
میتوانیم سفارشها و اطلاعات کاربران را با join() دریافت کنیم:
$orders = DB::table('orders')
->join('users', 'orders.user_id', '=', 'users.id')
->select(
'orders.id',
'orders.total',
'users.name'
)
->get();
حالا میتوانیم هم اطلاعات سفارش و هم نام کاربر را داشته باشیم.
# leftJoin()
برای Left Join:
$users = DB::table('users')
->leftJoin('orders', 'users.id', '=', 'orders.user_id')
->select(
'users.name',
'orders.total'
)
->get();
یکی از کاربردهای مهم leftJoin() زمانی است که میخواهیم تمام رکوردهای جدول اصلی را داشته باشیم، حتی اگر رکورد مرتبطی در جدول دوم وجود نداشته باشد.
# استفاده از چند Join
در Queryهای پیچیده میتوان چند جدول را به هم متصل کرد:
$orders = DB::table('orders')
->join('users', 'orders.user_id', '=', 'users.id')
->join('products', 'orders.product_id', '=', 'products.id')
->select(
'orders.id',
'users.name',
'products.title',
'orders.total'
)
->get();
این نوع Query در فروشگاههای اینترنتی، سیستمهای حسابداری، گزارشگیری و پنلهای مدیریتی بسیار رایج است.
# groupBy() در Query Builder
برای گروهبندی نتایج میتوان از groupBy() استفاده کرد.
مثلاً اگر بخواهیم تعداد سفارشهای هر کاربر را محاسبه کنیم:
$orders = DB::table('orders')
->select(
'user_id',
DB::raw('COUNT(*) as total_orders')
)
->groupBy('user_id')
->get();
در اینجا نتایج بر اساس user_id گروهبندی میشوند.
# توابع Aggregation در Query Builder
Laravel متدهای مختلفی برای محاسبات آماری در اختیار ما قرار میدهد.
مهمترین آنها عبارتاند از:
| متد | کاربرد |
|---|---|
count() | تعداد رکوردها |
sum() | مجموع |
avg() | میانگین |
min() | کمترین مقدار |
max() | بیشترین مقدار |
مثلاً:
$count = DB::table('users')->count();
یا:
$total = DB::table('orders')->sum('total');
برای میانگین:
$average = DB::table('products')->avg('price');
و برای بیشترین قیمت:
$maxPrice = DB::table('products')->max('price');
# distinct()
اگر بخواهیم نتایج تکراری حذف شوند:
$cities = DB::table('users')
->select('city')
->distinct()
->get();
این Query شهرهای یکتا را برمیگرداند.
# شرطهای پویا با when()
یکی از امکانات بسیار کاربردی Query Builder، ساخت Query بر اساس شرایط مختلف است.
فرض کنید یک صفحه جستجو داریم و کاربر میتواند نام و وضعیت را وارد کند.
به جای اینکه چندین if مختلف بنویسیم، میتوانیم از when() استفاده کنیم:
$query = DB::table('users');
$query->when($request->name, function ($query, $name) {
$query->where('name', 'like', "%{$name}%");
});
$query->when($request->status, function ($query, $status) {
$query->where('status', $status);
});
$users = $query->get();
این روش برای ساخت Search و Filterهای حرفهای بسیار کاربردی است.
# استفاده از Raw Query
گاهی Query موردنظر آنقدر خاص است که استفاده از متدهای معمول Query Builder کافی نیست.
در چنین شرایطی میتوان از DB::raw() استفاده کرد:
$users = DB::table('users')
->select(
'name',
DB::raw('COUNT(*) as total')
)
->groupBy('name')
->get();
اما استفاده از Raw باید با دقت انجام شود.
بهخصوص نباید مقادیر مستقیم و کنترلنشده کاربر را داخل SQL قرار دهید.
روش خطرناک:
DB::raw("price > $userInput");
اگر ورودی کاربر بدون کنترل وارد Query شود، میتواند خطر SQL Injection ایجاد کند.
در حالت کلی، تا جای ممکن از متدهای استاندارد Query Builder و Bindingهای Laravel استفاده کنید.
# Query Builder و SQL Injection
یکی از مزایای مهم Query Builder این است که Laravel در بسیاری از Queryهای معمول، پارامترها را به شکل امن Bind میکند.
مثلاً:
$user = DB::table('users')
->where('email', $email)
->first();
بهتر از ساختن SQL به شکل رشتهای است.
نباید Query را به شکل زیر بسازیم:
DB::select("SELECT * FROM users WHERE email = '$email'");
بهخصوص زمانی که $email از ورودی کاربر آمده باشد.
بنابراین:
هیچوقت برای راحتی، ورودی مستقیم کاربر را داخل SQL خام قرار ندهید.
# بررسی Query قبل از اجرا
گاهی هنگام توسعه نیاز داریم ببینیم Laravel دقیقاً چه Queryای ایجاد کرده است.
میتوانیم از toSql() استفاده کنیم:
$query = DB::table('users')
->where('status', 'active');
dd($query->toSql());
ممکن است خروجی چیزی شبیه این باشد:
select * from "users" where "status" = ?
علامت ? نشاندهنده پارامتری است که بعداً Binding میشود.
برای مشاهده Bindingها:
dd($query->getBindings());
این قابلیت هنگام Debug کردن Queryهای پیچیده بسیار مفید است.
# تفاوت Query Builder و Eloquent چیست؟
این یکی از مهمترین سؤالات هنگام یادگیری Laravel است.
هر دو ابزار برای کار با دیتابیس استفاده میشوند، اما هدف و سطح استفاده آنها متفاوت است.
| ویژگی | Query Builder | Eloquent |
|---|---|---|
| کار با جدول | مستقیم | از طریق Model |
| Model | ندارد | دارد |
| Relationship | به شکل مستقیم ندارد | دارد |
| خوانایی Query | بسیار خوب | بسیار خوب |
| Queryهای پیچیده | بسیار مناسب | مناسب |
| Joinهای متعدد | مناسب | قابل انجام |
| دسترسی به رفتار Model | ندارد | دارد |
| Accessor/Mutator | ندارد | دارد |
| Eventهای Model | ندارد | دارد |
| مناسب برای گزارشگیری | بسیار مناسب | مناسب |
| مناسب برای Domain Model | محدودتر | بسیار مناسب |
مثلاً با Eloquent:
$users = User::where('status', 'active')->get();
اما با Query Builder:
$users = DB::table('users')
->where('status', 'active')
->get();
در حالت Eloquent شما با Model کار میکنید.
در Query Builder مستقیماً با Query و جدول دیتابیس کار میکنید.
# چه زمانی Eloquent و چه زمانی Query Builder؟
هیچ قانون مطلقی وجود ندارد که بگوید همیشه باید یکی را انتخاب کنید.
برای مثال اگر در حال ساخت سیستم کاربران هستید و نیاز دارید:
- Relationship داشته باشید
- متدهای Model داشته باشید
- Accessor و Mutator استفاده کنید
- Eventهای Model داشته باشید
Eloquent معمولاً انتخاب طبیعیتری است.
اما اگر در حال ساخت یک گزارش مدیریتی هستید که چند جدول را Join میکند و فقط چند مقدار Aggregated لازم دارید، Query Builder میتواند انتخاب بسیار مناسبی باشد.
برای مثال:
$report = DB::table('orders')
->join('users', 'orders.user_id', '=', 'users.id')
->select(
'users.id',
'users.name',
DB::raw('SUM(orders.total) as total_sales')
)
->groupBy('users.id', 'users.name')
->get();
برای چنین گزارشهایی Query Builder بسیار خوانا و کاربردی است.
# Query Builder در یک پروژه واقعی
فرض کنید در حال ساخت یک فروشگاه اینترنتی با Laravel هستیم.
میخواهیم محصولات فعال را دریافت کنیم که:
- فعال باشند
- موجودی داشته باشند
- قیمت آنها بیشتر از 100 هزار تومان باشد
- بر اساس جدیدترین محصول مرتب شوند
- فقط چند ستون موردنیاز را دریافت کنیم.
میتوانیم بنویسیم:
$products = DB::table('products')
->select('id', 'title', 'price', 'stock')
->where('status', 'active')
->where('stock', '>', 0)
->where('price', '>', 100000)
->orderBy('created_at', 'desc')
->get();
این مثال نشان میدهد که چگونه میتوان چند قابلیت Query Builder را کنار یکدیگر قرار داد.
# ساخت Search با Query Builder
یکی از کاربردهای بسیار رایج Query Builder، ساخت سیستم جستجو است.
مثلاً:
$products = DB::table('products')
->where('title', 'like', '%' . $keyword . '%')
->get();
اگر بخواهیم چند فیلد را جستجو کنیم:
$products = DB::table('products')
->where(function ($query) use ($keyword) {
$query->where('title', 'like', "%{$keyword}%")
->orWhere('description', 'like', "%{$keyword}%");
})
->get();
این روش برای ساخت Search در فروشگاهها، CMSها و پنلهای مدیریتی بسیار کاربردی است.
# Query Builder و حجم زیاد داده
اگر با تعداد بسیار زیادی رکورد کار میکنید، نباید همیشه همه اطلاعات را با get() دریافت کنید.
مثلاً این Query:
$users = DB::table('users')->get();
اگر جدول میلیونها رکورد داشته باشد، میتواند مقدار زیادی حافظه مصرف کند.
برای پردازش دستهای دادهها میتوان از روشهایی مانند chunk() استفاده کرد:
DB::table('users')
->orderBy('id')
->chunk(1000, function ($users) {
foreach ($users as $user) {
// پردازش کاربر
}
});
در این حالت اطلاعات در دستههای کوچکتر پردازش میشوند.
# چند نکته مهم برای بهینهسازی Query Builder
استفاده از Query Builder بهتنهایی به معنی سریع بودن Query نیست.
برای عملکرد بهتر چند نکته مهم را رعایت کنید.
1. فقط ستونهای موردنیاز را دریافت کنید
به جای:
DB::table('users')->get();
در صورت نیاز:
DB::table('users')
->select('id', 'name')
->get();
2. روی ستونهای مناسب Index ایجاد کنید
اگر دائماً روی یک ستون جستجو میکنید، Index میتواند تأثیر زیادی روی عملکرد داشته باشد.
مثلاً:
email
status
user_id
created_at
البته Index باید بر اساس Queryهای واقعی پروژه طراحی شود و اضافه کردن Indexهای غیرضروری نیز هزینه دارد.
3. از Queryهای غیرضروری جلوگیری کنید
اگر فقط به وجود یک رکورد نیاز دارید، دریافت تمام اطلاعات آن رکورد منطقی نیست.
مثلاً:
$exists = DB::table('users')
->where('email', $email)
->exists();
به جای اینکه ابتدا رکورد کامل را دریافت کنیم.
# exists() و doesntExist()
برای بررسی وجود رکورد:
$exists = DB::table('users')
->where('email', $email)
->exists();
اگر رکورد وجود داشته باشد، مقدار true برمیگردد.
برای بررسی نبودن رکورد:
$notExists = DB::table('users')
->where('email', $email)
->doesntExist();
این روش برای Validationهای سفارشی و بررسی وضعیت دادهها بسیار مفید است.
# اشتباهات رایج در استفاده از Query Builder
1. دریافت تمام ستونها بدون نیاز
استفاده مداوم از:
->get()
بدون select() میتواند داده بیشتری از نیاز برنامه دریافت کند.
2. فراموش کردن شرط در Update
این کد خطرناک است:
DB::table('users')->update([
'status' => 'inactive',
]);
چون میتواند تمام کاربران را تغییر دهد.
3. فراموش کردن شرط در Delete
این کد نیز بسیار خطرناک است:
DB::table('users')->delete();
قبل از اجرای عملیات حذف همیشه Query را بررسی کنید.
4. استفاده نادرست از Raw SQL
استفاده بیدلیل از DB::raw() هم خوانایی را کاهش میدهد و هم اگر ورودیها بهدرستی Bind نشوند میتواند مشکلات امنیتی ایجاد کند.
5. استفاده از Query Builder در جایی که Eloquent مناسبتر است
اگر تمام منطق شما حول Modelها و Relationshipها میچرخد، استفاده مداوم از Query Builder ممکن است باعث شود بخش زیادی از امکانات Eloquent را از دست بدهید.
# آیا Query Builder امن است؟
خود Query Builder برای بسیاری از عملیات معمول از Parameter Binding استفاده میکند و این موضوع یکی از مزایای آن نسبت به ساخت SQL خام با رشتهها است.
اما این به معنی آن نیست که هر نوع استفاده از Query Builder خودکار امن است.
بهخصوص هنگام استفاده از:
DB::raw()
یا ساختن SQLهای خام باید مراقب ورودیهای کاربر باشید.
قاعده مهم:
> ورودی کاربر را مستقیماً وارد SQL خام نکنید.
# جمعبندی Query Builder در Laravel
Query Builder یکی از مهمترین ابزارهای Laravel برای کار با دیتابیس است.
با استفاده از آن میتوانیم بدون نوشتن مستقیم SQL، Queryهای مختلفی برای:
- دریافت اطلاعات
- فیلتر کردن
- مرتبسازی
- انتخاب ستونها
- Insert
- Update
- Delete
- Join
- Group By
- Aggregation
- جستجو
- بررسی وجود رکورد
- پردازش حجم زیادی از داده
ایجاد کنیم.
برای مثال یک Query نسبتاً کامل میتواند به شکل زیر باشد:
$products = DB::table('products')
->select('id', 'title', 'price', 'stock')
->where('status', 'active')
->where('stock', '>', 0)
->whereBetween('price', [100000, 1000000])
->orderBy('created_at', 'desc')
->limit(20)
->get();
در پروژههای واقعی، انتخاب بین Query Builder و Eloquent باید بر اساس نوع مسئله انجام شود. Eloquent برای کار با Modelها و Relationshipها بسیار قدرتمند است، در حالی که Query Builder برای Queryهای مستقیم، گزارشگیری و بسیاری از عملیات پیچیده دیتابیس انتخاب بسیار مناسبی است.
# سوالات متداول
Query Builder در Laravel چیست؟
Query Builder ابزاری در Laravel برای ساخت و اجرای Queryهای دیتابیس با استفاده از متدهای PHP است و اجازه میدهد بدون نوشتن مستقیم SQL بسیاری از عملیات دیتابیس را انجام دهید.
برای استفاده از Query Builder چه چیزی باید Import کنیم؟
معمولاً از Facade مربوط به DB استفاده میکنیم:
use Illuminate\Support\Facades\DB;
DB::table() چه کاری انجام میدهد؟
DB::table() جدول موردنظر را برای ساخت Query مشخص میکند:
DB::table('users')
تفاوت Query Builder و Eloquent چیست؟
Query Builder مستقیماً با Query و جدول دیتابیس کار میکند، در حالی که Eloquent بر پایه Modelها و قابلیتهایی مانند Relationship، Accessor، Mutator و Model Eventها ساخته شده است.
آیا Query Builder از SQL Injection جلوگیری میکند؟
Laravel در Queryهای معمول Query Builder از Parameter Binding استفاده میکند، اما هنگام استفاده از SQL خام و DB::raw() همچنان باید اصول امنیتی رعایت شود.
آیا Query Builder بهتر از Eloquent است؟
خیر. هیچکدام همیشه بهتر نیستند. انتخاب باید بر اساس نوع Query و نیاز پروژه انجام شود.
آیا میتوان با Query Builder چند جدول را Join کرد؟
بله. Query Builder متدهایی مانند join() و leftJoin() را در اختیار شما قرار میدهد.
مثلاً:
DB::table('orders')
->join('users', 'orders.user_id', '=', 'users.id')
->get();
آیا Query Builder برای پروژههای بزرگ مناسب است؟
بله. Query Builder در پروژههای بزرگ نیز کاربرد زیادی دارد، اما عملکرد نهایی به نحوه طراحی Query، Indexهای دیتابیس، حجم داده و معماری کلی سیستم بستگی دارد.





