Чат PHP-разработчиков
Удаление в Active Record

Удаление в Active Record

Всем привет! Сегодня мы дошли до самого интересного – операции удаления в Active Record :)

Удаление объекта мы будем производить вот так:

Код доступен только после покупки курса ООП в PHP.

То есть берём какой-то объект-наследник класса ActiveRecordEntity и вызываем у него метод delete(). Это должно привести к двум вещам:

  1. Должна удалиться запись в базе данных, соответствующая этому объекту
  2. Свойство id у этого объекта должно стать null (ведь его больше нет, логично же)

Удаление записей из таблиц выполняется следующим запросом:

Код доступен только после покупки курса ООП в PHP.

А дальше идёт текст для совсем ленивых. Если Вы не такой – напишите метод delete() самостоятельно – это очень просто.

Итак, создаём в нашем классе ActiveRecordEntity метод delete().

src/MyProject/Models/ActiveRecordEntity.php

Код доступен только после покупки курса ООП в PHP.

Всё! Метод для удаления готов!
Испытать его я вам предлагаю самостоятельно. О том, что именно требуется сделать, вы узнаете в домашнем задании.

Домашнее задание

Создайте роут для удаления статей - http://myproject.loc/articles/2/delete
При заходе на него получайте объект статьи по id и после этого удаляйте статью. Если статьи с таким id нет, то выдавайте соответствующее сообщение. Если же статья была, то выводите объект с помощью var_dump после удаления.

Онлайн обучение PHP
Путь с полного нуля до джуниора!
Начать бесплатно
Читайте также
Курс программирования на PHP
Подготовка до уровня устройства на работу!
Начать бесплатно
Комментарии (10)


SBTesla

файл ActiveRecordEntity.php

     public function delete(): void
     {
         $db = Db::getInstance();
         $db->query('DELETE FROM `' . static::getTableName() . '` WHERE id = :id', [':id' => $this->id]);
         $this->id = null;

     }
     public static function getById(int $id) : ?self
     {
          $db = Db::getInstance();
          $entities = $db->query(
                'SELECT * FROM `' . static::getTableName() . '` WHERE id=:id;',
                [':id' => $id],
                static::class
          );
          return $entities ? $entities[0] : null;
     }

файл Route.php

'~^articles/delete/(\d+)$~' => [\MyProject\Controllers\ArticlesController::class, 'delete'],

файл ArticleController.php

    public function delete (int $id)
    {
        $article = Article::getById($id);
        if ($article) {
            $article->delete();
            echo ' Статья удалена';
        }

       echo ' Статьи с таким id не существует';

    }
demyanovpaul@yandex.ru

Создайте роут для удаления статей - http://myproject.loc/articles/2/delete
При заходе на него получайте объект статьи по id и после этого удаляйте статью. Если статьи с таким id нет, то выдавайте соответствующее сообщение. Если же статья была, то выводите объект с помощью var_dump после удаления.

//notObject.php
<h1>Статья не существует, либо удалена</h1>

//ArticlesController.php
public function delete(int $articleId): void
{
        $article = Article::getById($articleId);

        if ($article === null) {
            $this->view->renderHtml('errors/notObject.php', [], 404);
            return;
        }
        $article->delete();

        var_dump($article);
}
ivashkevich

Супер! Шаблон можно назвать NotFound, и передавать в него переменную error с конкретной ошибкой.

demyanovpaul@yandex.ru

Спасибо, доделаю.

ivashkevich

Это необязательно, но будет круто, если сделаешь!

g--nokoder

ДЗ:
routes.php

'~^articles/(\d+)/delete$~' => [\MyProject\Controllers\ArticlesController::class, 'delete']

ArticlesController.php

public function delete(int $articleId): void
    {
        $article = Article::getById($articleId);

        if($article){
            $article->delete();
            echo "<p>Молодец, ты удалил статью !</p>";
            echo '<pre>';
            var_dump($article);
            echo '</pre>';
        }else {
            $this->view->renderHtml('errors/PageNot.php', [], 404);
        }
    }

PageNot.php

<title>Как ты нашел эту страницу ?!</title>
<p>Такая статья не существует!</p>
ivashkevich

Не надо в контроллерах HTML-тегов. Заведите отдельный шаблон для случая успешного удаления статьи.

Шаблон для отсутствующей страницы лучше назвать NotFound.

Вот так проверять:

if ($article)

плохо. Лучше сравнивать, что переменная !== null, или что значение является объектом какого-то класса (при помощи instanseof).

dom1r

После удаление статьи, если добавить новую, то в БД id присваивается следующий номер после удаленной, а не по порядку. Хотя в поле id стоит auto_increment, так и должно быть?
http://s1.radikali.ru/uploads/2018/12/2/5857e823d14c9bfc9790ffb029fa2ef2-full.png

ivashkevich

Да, база просто хранит последний использованный id отдельно, и шагает именно от него.

Самый понятный курс PHP
Онлайн-уроки в удобное время!
Начать бесплатно
Популярное за сутки
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Сейчас читают
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Новые статьи
Логические задачи с собеседований