آموزش جامع دستورات مهم SQL و معادل آنها در لاراول (Eloquent)
مدیریت پایگاه داده و تسلط بر کوئرینویسی یکی از مهمترین مهارتها برای هر Backend Developer و توسعهدهنده وب است. فریمورک لاراول با ارائه Eloquent ORM و Query Builder، تعامل با دیتابیس را بسیار سریع و لذتبخش کرده است؛ اما درک دقیق دستورات خالص SQL و معادل لاراولی آنها برای نوشتن برنامههای بهینه و کارآمد حیاتی است.
در این مقاله، تمامی دستورات پرکاربرد SQL را در ۵ بخش اصلی همراه با نمونه کدهای عملی در لاراول بررسی میکنیم.
🔍 بخش ۱: شرطگذاری و فیلتر کردن دادهها (Filtering)
برای فیلتر کردن و جداسازی دادهها از شرطهای مختلف در SQL استفاده میشود:
۱. شرط ساده با WHERE
بررسی یک شرط ساده روی ستونهای دیتابیس:
-- SQL
SELECT * FROM users WHERE status = 'active';
// Laravel Eloquent
$activeUsers = User::where('status', 'active')->get();۲. مقادیر خالی (whereNull & whereNotNull)
شناسایی رکوردهایی که مقدار یک ستون در آنها خالی (NULL) است یا برعکس:
-- SQL
SELECT * FROM users WHERE email_verified_at IS NULL;
SELECT * FROM users WHERE email_verified_at IS NOT NULL;
// Laravel Eloquent
$unverified = User::whereNull('email_verified_at')->get();
$verified = User::whereNotNull('email_verified_at')->get();۳. جستجوی لیستی، بازهای و متنی (whereIn, whereBetween & LIKE)
بررسی وجود مقدار در لیست، بازه عددی یا الگوی متنی:
-- SQL
SELECT * FROM products WHERE category_id IN (1, 2, 5);
SELECT * FROM products WHERE price BETWEEN 100000 AND 500000;
SELECT * FROM products WHERE title LIKE '%آیفون%';
// Laravel Eloquent
$inCategory = Product::whereIn('category_id', [1, 2, 5])->get();
$inRange = Product::whereBetween('price', [100000, 500000])->get();
$searchResults = Product::where('title', 'like', '%آیفون%')->get();⚡ بخش ۲: انتخاب، محدودسازی و دریافت داده (Selection & Fetching)
تعیین ستونهای دریافتی، مرتبسازی و محدود کردن تعداد نتایج خروجی:
۱. انتخاب ستونها و دریافت اولین رکورد (SELECT & first)
محدود کردن ستونهای خروجی و دریافت فقط یک رکورد:
-- SQL
SELECT id, name, email FROM users WHERE id = 1 LIMIT 1;
// Laravel Eloquent
$user = User::select('id', 'name', 'email')->where('id', 1)->first();۲. محدودسازی، رد کردن و مرتبسازی (Limit, Offset & OrderBy)
مرتبسازی صعودی/نزولی و اعمال Offset/Limit برای صفحهبندی:
-- SQL
SELECT * FROM posts ORDER BY views DESC LIMIT 5 OFFSET 10;
SELECT DISTINCT category_id FROM products;
// Laravel Eloquent
$posts = Post::orderBy('views', 'desc')
->skip(10) // OFFSET
->take(5) // LIMIT
->get();
$categories = Product::distinct()->get('category_id');📊 بخش ۳: توابع محاسباتی و گروهبندی (Aggregation & Grouping)
انجام محاسبات آماری و دستهبندی دادههای جدول:
۱. توابع محاسباتی پایه (COUNT, SUM, AVG, MIN, MAX)
محاسبه مستقیم روی ستونهای عددی:
-- SQL
SELECT COUNT(*) FROM users;
SELECT SUM(total_amount) FROM orders WHERE status = 'completed';
SELECT AVG(price) FROM products;
// Laravel Eloquent
$userCount = User::count();
$totalRevenue = Order::where('status', 'completed')->sum('total_amount');
$averagePrice = Product::avg('price');۲. گروهبندی و شرط روی گروهها (GROUP BY & HAVING)
دستهبندی دادهها و اعمال شرط روی نتایج گروهبندیشده:
-- SQL
SELECT city, SUM(total_amount) as total_spent
FROM orders
GROUP BY city
HAVING total_spent > 5000000;
// Laravel Query Builder
$citySales = DB::table('orders')
->select('city', DB::raw('SUM(total_amount) as total_spent'))
->groupBy('city')
->having('total_spent', '>', 5000000)
->get();🔗 بخش ۴: اتصال جداول (Joins)
ترکیب و دریافت همزمان دادهها از چند جدول مرتبط:
انواع Joinها در SQL و لاراول
اتصال جدولها بهصورت INNER JOIN، LEFT JOIN و RIGHT JOIN:
-- SQL (Inner Join & Left Join)
SELECT users.name, orders.order_number
FROM users
INNER JOIN orders ON users.id = orders.user_id;
SELECT users.name, orders.order_number
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
// Laravel Query Builder
$innerJoin = DB::table('users')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.name', 'orders.order_number')
->get();
$leftJoin = DB::table('users')
->leftJoin('orders', 'users.id', '=', 'orders.user_id')
->select('users.name', 'orders.order_number')
->get();🛠️ بخش ۵: تغییر و مدیریت دادهها (Data Manipulation)
دستورات مربوط به درج، ویرایش و حذف اطلاعات از جدول:
۱. درج داده جدید (INSERT INTO / create)
افزودن رکورد جدید به پایگاه داده:
-- SQL
INSERT INTO users (name, email, password) VALUES ('سامان', 'saman@example.com', 'hashed_password');
// Laravel Eloquent
$newUser = User::create([
'name' => 'سامان',
'email' => 'saman@example.com',
'password' => bcrypt('password123'),
]);۲. ویرایش دادهها (UPDATE / update)
بهروزرسانی مقادیر موجود در جدول:
-- SQL
UPDATE users SET status = 'expired' WHERE status = 'pending';
// Laravel Eloquent
User::where('status', 'pending')->update(['status' => 'expired']);۳. حذف دادهها (DELETE & TRUNCATE)
حذف رکوردهای مشخص یا پاکسازی کامل جدول:
-- SQL
DELETE FROM users WHERE status = 'expired';
TRUNCATE TABLE logs;
// Laravel Eloquent & Query Builder
User::where('status', 'expired')->delete();
DB::table('logs')->truncate();💻 نمونه کدهای عملی در پروژه لاراول (Laravel Example)
ترکیب تمامی این متدها در یک Controller واقعی لاراول:
namespace App\Http\Controllers;
use App\Models\Order;
use Illuminate\Http\Request;
class OrderController extends Controller
{
public function getUserOrders(Request $request)
{
// ترکیبی از where، whereNotNull، orderBy، limit و select
$orders = Order::select('id', 'order_number', 'total_amount', 'created_at')
->where('user_id', auth()->id())
->whereNotNull('paid_at')
->whereBetween('total_amount', [100000, 2000000])
->orderBy('created_at', 'desc')
->take(10)
->get();
return response()->json($orders);
}
}🛠️ جمعبندی؛ تسلط بر کوئرینویسی
نکته پایانی برای توسعهدهندگان
اگرچه Eloquent نوشتن کوئریها را فوقالعاده سریع و راحت میکند، اما همیشه به کدهای SQL تولیدشده در پشت صحنه دقت کنید. استفاده نادرست از متدها میتواند باعث ایجاد مشکل مشهور N+1 یا کُند شدن شدید پایگاه داده در حجم بالای دادهها شود. همیشه از ابزارهایی مانند Laravel Debugbar یا متد toSql() برای بررسی کوئریهای نهایی استفاده کنید.