Удаление записей из базы в Laravel Eloquent
Development | Комментировать запись
Eloquent – это объектно-реляционный преобразователь (ORM), который включен в структуру Laravel по умолчанию. В этой серии статей вы узнаете, как делать запросы к базе данных и как работать с отношениями в Laravel Eloquent. Также вы сможете попрактиковаться на примерах: мы попробуем улучшить демо-приложение с помощью новых моделей и отношений.
Примечание: Остальные мануалы данной серии можно найти по тегу Laravel Eloquent.
Удалять записи из базы данных в Eloquent очень удобно – это делается с помощью специального метода delete внутри родительского класса Model. Команда link:delete, уже реализованная в базовой версии нашего демо-приложения, удаляет ссылки по id. Однако в приложении по-прежнему отсутствует команда для удаления списков.
В последней части этой серии мы создадим новую команду для удаления списков.
Примечание: Для простоты после удаления списка все ссылки, связанные с ним, будут присвоены списку по умолчанию.
Откройте терминал и запустите следующую команду, чтобы создать новую команду Artisan:
docker-compose exec app php artisan make:command ListDelete
Это создаст новый файл ListDelete.php, расположенный в app/Console/Commands. Откройте файл в любом редакторе кода:
app/Console/Commands/ListDelete.php
Давайте обновим стандартный код команды, чтобы она могла обрабатывать удаление списка по его уникальному слагу (который представляет собой понятный URL).
Вот что должен делать наш метод handle():
- Получив предоставленный пользователем слаг, проверить наличие списка с данным слагом в базе данных.
- Если списка с таким слагом нет, отобразить сообщение об ошибке и завершить работу.
- Если список найден, попросить пользователя подтвердить операцию.
- Присвоить списку по умолчанию все ссылки, принадлежащие списку, который нужно удалить.
- Удалить список из базы данных.
Если вы выполнили все предыдущие части этой серии, значит, вы уже делали подобное при создании команды LinkUpdate. Основное отличие в данной ситуации состоит в том, что вам не нужно запрашивать у пользователя дополнительную информацию, а нужно запустить обновление перед запуском метода delete(), чтобы передать соответствующие ссылки другому списку.
Замените стандартный код в файле 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() сначала пробует найти список ссылок на основе предоставленного слага. Если такой список не обнаружен, приложение завершает работу с ошибкой. Если же такой список найден, приложение вызывает метод confirm(), который запрашивает у пользователя подтверждение.
После подтверждения приложение найдет список по умолчанию (а при необходимости и создаст новый, присвоив его переменной $default_list).
Затем оно найдет и обновит все ссылки, принадлежащие списку, который будет удален. Связанный вызов update() изменит ID списка для всех ссылок, соответствующих запросу, используя условие, определенное в предыдущем вызове where(). Эта строка выделена в коде для удобства.
В конце процесса список удаляется с помощью метода delete(), – его мы тоже выделили красным. Этот метод доступен для всех моделей Eloquent через родительский класс Model.
Чтобы удалить список, сначала запустим link:show.
docker-compose exec app php artisan link:show
Эта команда вернет все ссылки, находящиеся в настоящее время в базе данных:
+----+-------------------------------------------------+--------------+----------------------------------+ | 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 | +----+-------------------------------------------------+--------------+----------------------------------+
Чтобы удалить список из БД и вернуть его ссылки обратно в список по умолчанию, запустите:
docker-compose exec app php artisan list:delete digitalocean
Подтвердите операцию, нажав y и Enter.
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, вы увидите обновленную информацию о списках:
+----+-------------------------------------------------+---------+----------------------------------+ | 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 | +----+-------------------------------------------------+---------+----------------------------------+
Готово! Теперь в приложении появилась специальная команда для удаления списков, при этом она автоматически передает все ссылки из удаленного списка в список по умолчанию.
Tags: Eloquent, Laravel, Laravel Eloquent