مارک پلاس

تکنولوژی نوین اینترنتی

اجرای Raw Queries در لاراول

دسته‌بندی‌ها

اجرای Raw Queries در لاراول
Raw Queries در لاراول

در لاراول، برای اجرای Raw Queries می‌توان از متدهای مختلفی استفاده کرد. این متدها به شما امکان می‌دهند تا دستورات SQL را به‌طور مستقیم در پایگاه داده اجرا کنید. این روش‌ها به‌ویژه زمانی مفید هستند که بخواهید یک دستور SQL پیچیده را اجرا کنید که از قابلیت‌های Eloquent یا Query Builder به‌سادگی قابل پیاده‌سازی نباشد.

فصل 1: استفاده از DB Facade برای اجرای Raw Queries

لاراول یک کلاس DB برای اجرای Raw Queries فراهم می‌کند که می‌توان از آن برای اجرای دستورات SQL به‌طور مستقیم استفاده کرد.

1.1. اجرای یک دستور SELECT ساده

برای اجرای یک دستور SELECT می‌توانید از متد select استفاده کنید. این متد یک آرایه از نتایج را به‌عنوان خروجی برمی‌گرداند.

مثال:

php
use Illuminate\Support\Facades\DB; $posts = DB::select('SELECT * FROM posts WHERE status = ?', ['published']);

در اینجا:

  • دستور SELECT داده‌ها را از جدول posts با شرط status = 'published' انتخاب می‌کند.

  • از ? برای جلوگیری از حملات SQL Injection استفاده شده است، که مقادیر در یک آرایه ارسال می‌شوند.

1.2. اجرای دستورات INSERT

برای افزودن رکورد به پایگاه داده، از متد insert استفاده می‌شود. این متد به شما اجازه می‌دهد که چندین رکورد را به‌طور همزمان وارد کنید.

مثال:

php
use Illuminate\Support\Facades\DB; DB::insert('INSERT INTO posts (title, content) VALUES (?, ?)', ['New Post', 'Content of the post']);

این دستور یک رکورد جدید در جدول posts وارد می‌کند.

1.3. اجرای دستورات UPDATE

برای به‌روزرسانی داده‌ها در پایگاه داده، از متد update استفاده می‌شود.

مثال:

php
use Illuminate\Support\Facades\DB; DB::update('UPDATE posts SET status = ? WHERE id = ?', ['published', 1]);

این دستور وضعیت پست با id = 1 را به published تغییر می‌دهد.

1.4. اجرای دستورات DELETE

برای حذف رکوردها، از متد delete استفاده می‌شود.

مثال:

php
use Illuminate\Support\Facades\DB; DB::delete('DELETE FROM posts WHERE id = ?', [1]);

این دستور رکوردی را که دارای id = 1 است از جدول posts حذف می‌کند.

1.5. اجرای دستورات Raw برای اجرای دستورات پیچیده

اگر به دستورات پیچیده نیاز دارید که خارج از دستورهای ساده SELECT، INSERT، UPDATE و DELETE باشند، می‌توانید از متد statement استفاده کنید. این متد به شما این امکان را می‌دهد که دستوراتی مانند ایجاد ایندکس‌ها یا تغییرات پیچیده در ساختار پایگاه داده را اجرا کنید.

مثال:

php
use Illuminate\Support\Facades\DB; DB::statement('ALTER TABLE posts ADD COLUMN views INT DEFAULT 0');

این دستور یک ستون جدید به نام views به جدول posts اضافه می‌کند.


فصل 2: استفاده از Query Builder برای اجرای Raw Queries

لاراول Query Builder را برای اجرای دستورات SQL به صورت زنجیره‌ای و ساده‌تر فراهم کرده است. علاوه بر این، می‌توانید Raw Queries را با ترکیب آن با Query Builder اجرا کنید.

2.1. اجرای Raw SELECT با Query Builder

اگر می‌خواهید یک دستور SELECT پیچیده را با Query Builder استفاده کنید، می‌توانید از متد fromRaw استفاده کنید.

مثال:

php
use Illuminate\Support\Facades\DB; $results = DB::table(DB::raw('posts as p')) ->select(DB::raw('COUNT(p.id) as post_count')) ->whereRaw('p.status = ?', ['published']) ->get();

در اینجا، از DB::raw() برای نوشتن Raw SQL استفاده شده است.

2.2. استفاده از whereRaw برای شرایط پیچیده

گاهی اوقات برای نوشتن شرایط پیچیده در where، باید از whereRaw استفاده کنید.

مثال:

php
use Illuminate\Support\Facades\DB; $posts = DB::table('posts') ->whereRaw('status = ? AND created_at > ?', ['published', '2021-01-01']) ->get();

این دستور پست‌هایی را که وضعیت آن‌ها published است و تاریخ ایجاد آن‌ها بعد از 2021-01-01 است، دریافت می‌کند.


فصل 3: استفاده از Eloquent برای اجرای Raw Queries

اگر به‌طور مستقیم از Eloquent برای اجرای Raw Queries استفاده می‌کنید، می‌توانید از متدهای raw برای اجرای دستورات SQL استفاده کنید.

3.1. اجرای Raw SELECT با Eloquent

اگر می‌خواهید داده‌ها را با استفاده از Eloquent ولی با یک دستور RAW SELECT دریافت کنید، می‌توانید از selectRaw استفاده کنید:

مثال:

php
use App\Models\Post; $posts = Post::selectRaw('COUNT(id) as post_count') ->whereRaw('status = ?', ['published']) ->get();

در اینجا، از selectRaw برای اجرای دستور RAW SELECT استفاده شده است و شرایط با whereRaw اعمال شده است.

3.2. اجرای Raw Queries برای دستورات دیگر با Eloquent

برای اجرای دستوراتی مانند INSERT، UPDATE و DELETE با استفاده از Raw Queries و Eloquent، می‌توانید از متد DB::statement یا DB::update استفاده کنید.

مثال:

php
use Illuminate\Support\Facades\DB; DB::update('UPDATE posts SET status = ? WHERE id = ?', ['published', 1]);

این دستور همانند استفاده از DB برای اجرای دستورات UPDATE است.


فصل 4: احتیاط‌ها و نکات امنیتی

هنگام استفاده از Raw Queries، باید به نکات امنیتی توجه داشته باشید:

  1. حملات SQL Injection:

    • همواره از Bindings (پارامترهای جانبی مانند ?) برای جلوگیری از حملات SQL Injection استفاده کنید. این کار می‌تواند امنیت کد شما را افزایش دهد.

    • هرگز داده‌ها را مستقیماً در دستورات SQL قرار ندهید.

  2. عملکرد و مقیاس‌پذیری:

    • استفاده از Raw Queries ممکن است عملکرد بهتری نسبت به Query Builder یا Eloquent در برخی موارد داشته باشد، اما این می‌تواند باعث کاهش مقیاس‌پذیری و خوانایی کد شود.

  3. پشتیبانی از پایگاه داده‌های مختلف:

    • توجه داشته باشید که دستورهای Raw SQL ممکن است در پایگاه داده‌های مختلف (MySQL، PostgreSQL، SQLite و ...) متفاوت عمل کنند. بنابراین، اگر از چندین پایگاه داده استفاده می‌کنید، به این موضوع دقت کنید.


نتیجه‌گیری

در لاراول، برای اجرای Raw Queries می‌توانید از کلاس DB یا حتی Query Builder و Eloquent استفاده کنید. این روش‌ها به شما امکان می‌دهند که دستورات SQL پیچیده و خاص را اجرا کنید. با این حال، همیشه باید از Binding پارامترها برای جلوگیری از حملات SQL Injection استفاده کنید و در هنگام استفاده از Raw Queries دقت کنید تا کد شما امن و قابل نگهداری باشد.

محتوای مرتبط

پست‌های مرتبط