LaravelEloquentでデータベースレコードを削除する方法

提供:Dev Guides
移動先:案内検索

Eloquentでは、deleteメソッドを使用して、親Modelクラスからデータベースレコードを簡単に削除できます。 link:deleteコマンドは、デモアプリケーションのベースバージョン内にすでに実装されており、有効なリンクidに基づいてリンクを削除します。 アプリケーションには、リストを削除するコマンドがまだありません。

このシリーズの最後のパートでは、リストを削除するための新しいコマンドを作成します。 簡単にするために、削除するリストに関連付けられているリンクはすべて、デフォルトのリンクリストに再割り当てされます。

ターミナルから次のコマンドを実行して、新しいArtisanコマンドをブートストラップします。

docker-compose exec app php artisan make:command ListDelete

これにより、app/Console/Commandsに新しいListDelete.phpファイルが作成されます。 選択したコードエディタでファイルを開きます。

app/Console/Commands/ListDelete.php

このコードを更新して、各リストを識別するために使用されるURLに適した名前である一意のslugを提供するリンクリストの削除を処理します。

これは、handle()メソッドが実行する必要があることです。

  • ユーザーから提供されたslugを取得し、データベース内にslugと一致するリストが存在するかどうかを確認します。
  • 有効なリストが見つからない場合は、エラーメッセージを表示して終了します。
  • 有効なリストが見つかった場合は、ユーザーに確認を求めます。
  • 削除されるリストに関連付けられているリンクをデフォルトリストに再割り当てします。
  • データベースからリストを削除します。

これまでシリーズのすべてのパートをフォローしてきた場合は、LinkUpdateコマンドを作成する前に同様のコードを実装したことがあります。 現在の主な違いは、ユーザーに追加情報の入力を求める必要がないことです。delete()メソッドを実行する前に、関連するリンクを別のリストに変更するために一括更新を実行する必要があります。

ListDelete.phpファイルのボイラープレートコードを次のように置き換えます。

app / Console / Commands / 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            |
+----+-------------------------------------------------+---------+----------------------------------+
 

アプリケーションには、リンクのリストを削除するための専用コマンドがあります。