如何在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            |
+----+-------------------------------------------------+---------+----------------------------------+
 

该应用程序现在有一个专用命令来删除链接列表。