Создание сайта с помощью фреймворка HLEB. Часть 5. Добавляем модели.

17 Сентября 2022 (ред)

Продолжаем создание демонстрационного проекта на PHP фреймворке HLEB. Перед тем, как назначить контроллеры, нужно создать две модели, которые будут там использоваться, первая будет заведовать таблицей users (она создана на шаге установки регистрации) и likes, последнюю нужно создать. В ней будут храниться пользовательские лайки.

Примеры создания для MySQL, но они простые и можно переложить на любой другой поддерживаемый синтаксис. Создание таблицы:

CREATE TABLE `likes` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `user_id` INT(11) NOT NULL , `count` INT DEFAULT '0', PRIMARY KEY (`id`)) ENGINE = InnoDB;

Это тестовая таблица, но если у вас есть на неё планы, то правильнее будет связать её с таблицей users, теперь при удалении пользователя, будут удалятся его данные по лайкам.

ALTER TABLE `likes` ADD FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE;

Еще можно указать, что user_id - уникальное значение. При большом размере таблицы поиск по полю будет производится быстрее.

ALTER TABLE `likes` ADD UNIQUE(`user_id`);

Модели

Готово, таблица создана, Модель для неё будет такой (нужно создать файл и скопировать в него этот код):

<?php

/* Файл /app/Models/LikeModel.php */

namespace App\Models;

class LikeModel extends \Hleb\Scheme\App\Models\MainModel
{
    /** Добавляет пользователю +1 лайк */
    public static function add(int $userId) {
        $count = self::get($userId) + 1;
        /* Если добавление не прошло, то значит такой строки нет */
        if (!\DB::run("UPDATE `likes` SET `count` =? WHERE `user_id` =?", [$count, $userId])->rowCount()) {
                /*  Добавляется новая строка */
                \DB::run("INSERT INTO `likes` (`user_id`, `count`) VALUES (?, ?)", [$userId, $count]);
        }

        return $count;
    }

    /** Возвращает количество лайков у пользователя */
     public static function get(int $userId) {
       return (int)\DB::run("SELECT `count` FROM `likes` WHERE `user_id` = ?", [$userId])->fetchColumn();
     }

     public static function deleteAll() {
         \DB::run("TRUNCATE TABLE `likes`");
     }
}

Теперь можно обращаться к таблице через этот класс-обёртку.

Модель для таблицы пользователей:

<?php

/* Файл /app/Models/UserModel.php */

namespace App\Models;

class UserModel extends \MainModel
{
    /** Возвращает данные пользователя */
    public static function getUserPublicData($userId) {

        /* Подключение основано на PDO, поэтому указываем искомое id как `?` в запросе и добавляем его в массив значений. */
        $sql = 'SELECT `id`, `email`, `login`, `name`, `surname`, `regdate`
                            FROM `users`
                            WHERE `id` = ? AND `regtype` > 0';

        return \DB::run($sql, [$userId])->fetch();
    }

    /** Возвращает лимитированный топ пользователей по лайкам */
    public static function getUserTopByLimit(int $limit = 20) {
        return \DB::run("SELECT `users`.`id`, `likes`.`count`
                         FROM `users`
                         LEFT JOIN `likes`
                         ON  `users`.`id` = `likes`.`user_id`
                         WHERE `users`.`regtype` > 0                       
                         ORDER BY `likes`.`count` DESC
                         LIMIT ? ;", [$limit])->fetchAll();
    }
}

Скачать все файлы урока в ZIP-архиве

Предыдущая статья

В начало

Продолжение. Часть 6

fomiash fomiash + 221
Опубликовано в PHP фреймворк HLEB
Для ответа вы можете авторизоваться


Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.