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

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

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

  1. docker-compose exec app php artisan make:command ListDelete

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

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() 前に定義された条件を使用して、クエリに一致するすべてのリンクの参照リストIDを更新します where() 電話。 この行は、参照用に強調表示されています。

最後に、リストは delete()メソッドで削除され、これも強調表示されます。 このメソッドは、親を介してすべてのEloquentモデルで使用できます Model クラス。

リストを削除するには、最初に実行します link:show 現在データベースにあるすべてのリンクを取得するには:

  1. 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 リストに戻すには、次のコマンドを実行します。

  1. 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 | +----+-------------------------------------------------+---------+----------------------------------+

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