如何在LaravelEloquent中删除数据库记录
在 Eloquent 中,您可以使用父 Model
类的 delete
方法方便地删除数据库记录。 link:delete
命令已在演示应用程序的基本版本中实现,它根据有效链接 id 删除链接。 该应用程序仍然缺少删除列表的命令。
在本系列的最后一部分中,您将创建一个新命令来删除列表。 为简单起见,与要删除的列表关联的任何链接都将重新分配给默认链接列表。
在您的终端上,运行以下命令来引导一个新的 Artisan 命令:
docker-compose exec app php artisan make:command ListDelete
这将创建一个位于 app/Console/Commands
的新 ListDelete.php
文件。 在您选择的代码编辑器中打开文件:
app/Console/Commands/ListDelete.php
您将更新此代码以处理删除链接列表,只要其唯一的 slug 是用于标识每个列表的 URL 友好名称。
这是您的 handle()
方法需要做的:
- 获取用户提供的 slug 并检查数据库中是否存在与 slug 匹配的列表。
- 如果找不到有效列表,则显示错误消息并退出。
- 如果找到有效列表,则提示用户确认。
- 将与将被删除的列表关联的所有链接重新分配给默认列表。
- 从数据库中删除列表。
如果到目前为止您一直在关注该系列的所有部分,那么您在创建 LinkUpdate
命令之前已经实现了类似的代码。 现在的主要区别是您不需要提示用户提供其他信息,并且在运行 delete()
方法之前,您需要运行批量更新以将关联链接更改为不同的列表。
将 ListDelete.php
文件中的样板代码替换为以下内容:
应用程序/控制台/命令/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()
调用中定义的条件更新与查询匹配的所有链接上的引用列表 ID。 此行突出显示供您参考。
最后,使用 delete() 方法删除列表,同样突出显示。 通过父 Model
类,此方法适用于所有 Eloquent 模型。
要删除列表,首先运行 link:show
以获取当前在数据库中的所有链接:
docker-compose exec app php artisan link:show
Output+----+-------------------------------------------------+--------------+----------------------------------+ | id | url | list | description | +----+-------------------------------------------------+--------------+----------------------------------+ | 1 | https://digitalocean.com/community | digitalocean | DO Community | | 2 | https://digitalocean.com/community/tags/laravel | digitalocean | Laravel Tutorias at DigitalOcean | | 3 | https://digitalocean.com/community/tags/php | digitalocean | PHP Tutorials at DigitalOcean | | 4 | https://twitter.com/digitalocean | social | Twitter | | 5 | https://dev.to/digitalocean | social | DEV.to | | 6 | https://laravel.com/docs/8.x/eloquent | default | Laravel Eloquent Docs | +----+-------------------------------------------------+--------------+----------------------------------+
要删除 digitalocean 列表并将这些链接恢复到 default 列表,请运行:
docker-compose exec app php artisan list:delete digitalocean
输入 y
并点击 ENTER
确认删除。
Output Confirm deleting the list 'digitalocean'? Links will be reassigned to the default list. (yes/no) [no]: > y Reassigning links to default list... List Deleted.
如果再次运行 link:show()
命令,您将看到更新的信息:
Output+----+-------------------------------------------------+---------+----------------------------------+ | id | url | list | description | +----+-------------------------------------------------+---------+----------------------------------+ | 1 | https://digitalocean.com/community | default | DO Community | | 2 | https://digitalocean.com/community/tags/laravel | default | Laravel Tutorias at DigitalOcean | | 3 | https://digitalocean.com/community/tags/php | default | PHP Tutorials at DigitalOcean | | 4 | https://twitter.com/erikaheidi | social | Twitter | | 5 | https://dev.to/erikaheidi | social | DEV.to | | 6 | https://laravel.com/docs/8.x/eloquent | default | Laravel Eloquent Docs | +----+-------------------------------------------------+---------+----------------------------------+
该应用程序现在有一个专用命令来删除链接列表。