Eloquent یک نگاشت رابطه به شیء یا ORM است که به صورت پیشفرض در فریمورک لاراول وجود دارد. در این سری از مطالب قصد داریم که شما را با نحوه ساخت کوئریهای پایگاه داده و کار با روابط در Laravel Eloquent آشنا کنیم. برای این منظور از یک اپلیکیشن نمونه استفاده میکنیم که آن را رفتهرفته با مدلها و روابط جدید ارتقا میدهیم. در Eloquent امکان حذف رکوردهای پایگاه داده با استفاده از متد delete در کلاس مادر Model وجود دارد. فرمان link:delete که توسط نسخه پایگاه اپلیکیشن نمونه استفاده شده، لینکها را بر اساس شناسه آنها حذف میکند. امّا اپلیکیشن هنوز فرمانی برای حذف لیستها ندارد.
در اینجا قصد داریم که یک فرمان جدید برای حذف لیستها ایجاد کنیم. برای سادگی کار، تمام لینکهایی که با لیستی که قرار است حذف شود، مرتبط هستند، به لیست لینکهای پیشفرض اضافه میشوند.
ایجاد یک فرمان جدید برای حذف رکوردهای پایگاه داده
در ترمینال، فرمان زیر را برای پایهریزی یک فرمان جدید Artisan اجرا کنید.
docker-compose exec app php artisan make:command ListDelete
در نتیجه یک فایل جدید ListDelete.php در آدرس app/Console/Commands ساخته میشود. سپس این فایل را در ویرایشگر کد دلخواهتان باز کنید.
app/Console/Commands/ListDelete.php
در ادامه این کد را برای مدیریت حذف یک لیست از لینکها بروزرسانی میکنیم. هر کدام از لیستها با یک نام ساده و قابلفهم بر اساس URL شناخته میشوند.
متد handle() شما میبایست این کارها را انجام دهد.
- دستیابی به یک slug که توسط کاربر ارائه شده و بررسی وجود یک لیست مطابق با slug در پایگاه داده.
- در صورتی که یک لیست معتبر پیدا نشود، پیغام خطا نمایش داده شده و خروج انجام گردد.
- در صورتی که لیست معتبر پیدا شود، پیغام درخواست تأیید برای کاربر ظاهر گردد.
- اختصاص هر کدام از لینکهای مرتبط با لیست موردنظر برای حذف به لیست پیشفرض.
- حذف لیست از پایگاه داده.
کد اولیه موجود در فایل ListDelete.php را با خطوط زیر جایگزین کنید.
<?php namespace App\Console\Commands; use App\Models\Link; use App\Models\LinkList; use Illuminate\Console\Command; class ListDelete extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'list:delete {list_slug}'; /** * The console command description. * * @var string */ protected $description = 'Delete Lists'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return int */ public function handle() { $list_slug = $this->argument('list_slug'); $list = LinkList::firstWhere('slug', $list_slug); if ($list === null) { $this->error("Invalid or non-existent List."); return 1; } if ($this->confirm("Confirm deleting the list '$list->title'? Links will be reassigned to the default list.")) { $default_list = LinkList::firstWhere('slug', 'default'); if (!$default_list) { $default_list = new LinkList(); $default_list->title = 'default'; $default_list->slug = 'default'; $default_list->save(); } $this->info("Reassigning links to default list..."); Link::where('link_list_id', $list->id)->update(['link_list_id' => $default_list->id]); $list->delete(); $this->info("List Deleted."); } return 0; } }
حالا فایل را ذخیره کنید.
در این کد، متد handle() با پیدا کردن لیست لینک بر اساس slug ارائهشده شروع میشود. در صورتی که کد نتواند این لیست را پیدا کند، اپلیکیشن همراه با یک پیغام خطا بسته میشود. در صورتی که یک لیست معتبر پیدا شود، متد confirm() برای درخواست تأیید از کاربر فراخوانی میشود.
وقتی تأیید انجام شد، اپلیکیشن لیست پیشفرض را موقعیتیابی میکند. یا در صورت لزوم، یک لیست پیشفرض جدید ایجاد مینماید و آن را به متغیر $default_list اختصاص میدهد.
سپس نوبت به پیدا کردن موقعیت و بروزرسانی تمام لینکهای مرتبط با لیست موردنظر برای حذف است. زنجیره فراخوانی update() موجب بروزرسانی شناسه مرجع لیست در تمام لینکهای مطابق با درخواست میشود. این کار از طریق شرط تعریفشده فراخوانی قبلی where() صورت میگیرد.
نهایتاً حذف لیست از پایگاه داده با کمک متد delete() صورت میگیرد. این متد از طریق کلاس مادر Model برای تمام مدلهای Eloquent در دسترس است.
برای حذف لیست از پایگاه داده برای نمایش تمام لینکهایی که در پایگاه داده قرار دارند، از فرمان زیر استفاده کنید.
docker-compose exec app php artisan link:show
نمونه خروجی
+----+-------------------------------------------------+--------------+----------------------------------+ | id | url | list | description | +----+-------------------------------------------------+--------------+----------------------------------+ | 1 | https://ariaservice.net/community | ariaservice | DO Community | | 2 | https://ariaservice.net//community/tags/laravel | ariaservice | Laravel Tutorias at AriaService | | 3 | https://ariaservice.net//community/tags/php | ariaservice | PHP Tutorials at AriaService | | 4 | https://twitter.com/ariaservice | social | Twitter | | 5 | https://dev.to/ariaservice | social | DEV.to | | 6 | https://laravel.com/docs/8.x/eloquent | default | Laravel Eloquent Docs | +----+-------------------------------------------------+--------------+----------------------------------+
به منظور حذف تمام لینکهای ariaservice و برگشت تمام این لینکها به لیست پیشفرض داریم:
docker-compose exec app php artisan list:delete ariaservice
حذف لیست از پایگاه داده را با زدن حرف y تأیید کنید و سپس Enter بزنید.
نمونه خروجی
Confirm deleting the list 'ariaservice'? Links will be reassigned to the default list. (yes/no) [no]: > y Reassigning links to default list... List Deleted.
در صورتی که فرمان link:show() را برای بار دوم اجرا کنید، اطلاعات بروزرسانی را ملاحظه خواهید کرد.
نمونه خروجی
+----+-------------------------------------------------+---------+----------------------------------+ | id | url | list | description | +----+-------------------------------------------------+---------+----------------------------------+ | 1 | https://ariaservice.net/community | default | DO Community | | 2 | https://ariaservice.net/community/tags/laravel | default | Laravel Tutorias at AriaService | | 3 | https://ariaservice.net/community/tags/php | default | PHP Tutorials at AriaService | | 4 | https://twitter.com/ariaservice | social | Twitter | | 5 | https://dev.to/ariaservice | social | DEV.to | | 6 | https://laravel.com/docs/8.x/eloquent | default | Laravel Eloquent Docs | +----+-------------------------------------------------+---------+----------------------------------+
اکنون اپلیکیشن دارای یک فرمان اختصاصی برای حذف لیست لینکها از پایگاه داده خواهد بود.