Eloquent یک نگاشت رابطه به شیء یا ORM است که به صورت پیشفرض در فریمورک لاراول وجود دارد. در این سری از مطالب قصد داریم که شما را با نحوه ساخت کوئریهای پایگاه داده و کار با روابط در Laravel Eloquent آشنا کنیم. برای این منظور از یک اپلیکیشن نمونه استفاده میکنیم که آن را رفتهرفته با مدلها و...
1400/07/064428 بازدید
Eloquent یک نگاشت رابطه به شیء یا ORM است که به صورت پیشفرض در فریمورک لاراول وجود دارد. در این سری از مطالب قصد داریم که شما را با نحوه ساخت کوئریهای پایگاه داده و کار با روابط در Laravel Eloquent آشنا کنیم. برای این منظور از یک اپلیکیشن نمونه استفاده میکنیم که آن را رفتهرفته با مدلها و روابط جدید ارتقا میدهیم. در Eloquent امکان حذف رکوردهای پایگاه داده با استفاده از متد delete در کلاس مادر Model وجود دارد. فرمان link:delete که توسط نسخه پایگاه اپلیکیشن نمونه استفاده شده، لینکها را بر اساس شناسه آنها حذف میکند. امّا اپلیکیشن هنوز فرمانی برای حذف لیستها ندارد.
در اینجا قصد داریم که یک فرمان جدید برای حذف لیستها ایجاد کنیم. برای سادگی کار، تمام لینکهایی که با لیستی که قرار است حذف شود، مرتبط هستند، به لیست لینکهای پیشفرض اضافه میشوند.
ایجاد یک فرمان جدید برای حذف رکوردهای پایگاه داده
در ترمینال، فرمان زیر را برای پایهریزی یک فرمان جدید Artisan اجرا کنید.
در نتیجه یک فایل جدید ListDelete.php در آدرس app/Console/Commands ساخته میشود. سپس این فایل را در ویرایشگر کد دلخواهتان باز کنید.
php
1app/Console/Commands/ListDelete.php
در ادامه این کد را برای مدیریت حذف یک لیست از لینکها بروزرسانی میکنیم. هر کدام از لیستها با یک نام ساده و قابلفهم بر اساس URL شناخته میشوند.
متد handle() شما میبایست این کارها را انجام دهد.
دستیابی به یک slug که توسط کاربر ارائه شده و بررسی وجود یک لیست مطابق با slug در پایگاه داده.
در صورتی که یک لیست معتبر پیدا نشود، پیغام خطا نمایش داده شده و خروج انجام گردد.
در صورتی که لیست معتبر پیدا شود، پیغام درخواست تأیید برای کاربر ظاهر گردد.
اختصاص هر کدام از لینکهای مرتبط با لیست موردنظر برای حذف به لیست پیشفرض.
حذف لیست از پایگاه داده.
کد اولیه موجود در فایل ListDelete.php را با خطوط زیر جایگزین کنید.
php
1<?php23namespace App\Console\Commands;45use App\Models\Link;67use App\Models\LinkList;89use Illuminate\Console\Command;1011class ListDelete extends Command1213{1415/**1617* The name and signature of the console command.1819*2021* @var string2223*/2425protected $signature = 'list:delete {list_slug}';2627/**2829* The console command description.3031*3233* @var string3435*/3637protected $description = 'Delete Lists';3839/**4041* Create a new command instance.4243*4445* @return void4647*/4849public function __construct()5051{5253parent::__construct();5455}5657/**5859* Execute the console command.6061*6263* @return int6465*/6667public function handle()6869{7071$list_slug = $this->argument('list_slug');7273$list = LinkList::firstWhere('slug', $list_slug);7475if ($list === null) {7677$this->error("Invalid or non-existent List.");7879return 1;8081}8283if ($this->confirm("Confirm deleting the list '$list->title'? Links will be reassigned to the default list.")) {8485$default_list = LinkList::firstWhere('slug', 'default');8687if (!$default_list) {8889$default_list = new LinkList();9091$default_list->title = 'default';9293$default_list->slug = 'default';9495$default_list->save();9697}9899$this->info("Reassigning links to default list...");100101Link::where('link_list_id', $list->id)->update(['link_list_id' => $default_list->id]);102103$list->delete();104105$this->info("List Deleted.");106107}108109return 0;110111}112113}
حالا فایل را ذخیره کنید.
در این کد، متد handle() با پیدا کردن لیست لینک بر اساس slug ارائهشده شروع میشود. در صورتی که کد نتواند این لیست را پیدا کند، اپلیکیشن همراه با یک پیغام خطا بسته میشود. در صورتی که یک لیست معتبر پیدا شود، متد confirm() برای درخواست تأیید از کاربر فراخوانی میشود.
وقتی تأیید انجام شد، اپلیکیشن لیست پیشفرض را موقعیتیابی میکند. یا در صورت لزوم، یک لیست پیشفرض جدید ایجاد مینماید و آن را به متغیر $default_list اختصاص میدهد.
سپس نوبت به پیدا کردن موقعیت و بروزرسانی تمام لینکهای مرتبط با لیست موردنظر برای حذف است. زنجیره فراخوانی update() موجب بروزرسانی شناسه مرجع لیست در تمام لینکهای مطابق با درخواست میشود. این کار از طریق شرط تعریفشده فراخوانی قبلی where() صورت میگیرد.
نهایتاً حذف لیست از پایگاه داده با کمک متد delete() صورت میگیرد. این متد از طریق کلاس مادر Model برای تمام مدلهای Eloquent در دسترس است.
برای حذف لیست از پایگاه داده برای نمایش تمام لینکهایی که در پایگاه داده قرار دارند، از فرمان زیر استفاده کنید.
php
1docker-compose exec app php artisan link:show
نمونه خروجی
php
1+----+-------------------------------------------------+--------------+----------------------------------+23| id | url | list | description |45+----+-------------------------------------------------+--------------+----------------------------------+67| 1 | https://ariaservice.net/community | ariaservice | DO Community |89| 2 | https://ariaservice.net//community/tags/laravel | ariaservice | Laravel Tutorias at AriaService |1011| 3 | https://ariaservice.net//community/tags/php | ariaservice | PHP Tutorials at AriaService |1213| 4 | https://twitter.com/ariaservice | social | Twitter |1415| 5 | https://dev.to/ariaservice | social | DEV.to |1617| 6 | https://laravel.com/docs/8.x/eloquent | default | Laravel Eloquent Docs |1819+----+-------------------------------------------------+--------------+----------------------------------+
به منظور حذف تمام لینکهای ariaservice و برگشت تمام این لینکها به لیست پیشفرض داریم:
حذف لیست از پایگاه داده را با زدن حرف y تأیید کنید و سپس Enter بزنید.
نمونه خروجی
php
1Confirm deleting the list 'ariaservice'? Links will be reassigned to the default list. (yes/no) :23> y45Reassigning links to default list...67List Deleted.
در صورتی که فرمان link:show() را برای بار دوم اجرا کنید، اطلاعات بروزرسانی را ملاحظه خواهید کرد.
نمونه خروجی
php
1+----+-------------------------------------------------+---------+----------------------------------+23| id | url | list | description |45+----+-------------------------------------------------+---------+----------------------------------+67| 1 | https://ariaservice.net/community | default | DO Community |89| 2 | https://ariaservice.net/community/tags/laravel | default | Laravel Tutorias at AriaService |1011| 3 | https://ariaservice.net/community/tags/php | default | PHP Tutorials at AriaService |1213| 4 | https://twitter.com/ariaservice | social | Twitter |1415| 5 | https://dev.to/ariaservice | social | DEV.to |1617| 6 | https://laravel.com/docs/8.x/eloquent | default | Laravel Eloquent Docs |1819+----+-------------------------------------------------+---------+----------------------------------+
اکنون اپلیکیشن دارای یک فرمان اختصاصی برای حذف لیست لینکها از پایگاه داده خواهد بود.