Telegram бот на Laravel #3: создание моделей — PROG-TIME

Telegram бот на Laravel #3: создание моделей

26.06.2024
Содержание:

Для работы с нашими сущностями, необходимо создать модели. Модели создаются отталкиваясь от названия таблицы (в единственном числе).

Таким образом, нам нужно создать следующие модели:

php artisan make:model Article
php artisan make:model BotUser
php artisan make:model Chapter
php artisan make:model Favorite
php artisan make:model ProgressStudy

Если вы сделали все правильно, то созданные модели появятся в директории app/Models.

Часть сущностей будет создаваться через админку MoonShine, поэтому методы для этих моделей создавать не нужно!

Модель BotUser

Здесь я добавил метод changeUser() для создания и редактирования информации о пользователе.

Код модели:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class BotUser extends Model
{
    protected $table = 'bot_users';

    protected $fillable = [
        'id_telegram',
        'firstname',
        'lastname',
        'username',
        'study_status',
        'updated_at',
        'created_at',
    ];

    /**
     * Изменение информации о клиенте
     *
     * @param int $telegramID - id Telegram пользователя
     * @param array $dataUser - информация о пользователе
     * @return object
     */
    public static function changeUser(int $telegramID, array $dataUser): object
    {
        $userData = static::where('id_telegram', $telegramID)->first();
        if (empty($userData)) {
            static::create(
                [
                    'id_telegram' => $dataUser['id_telegram'] ?? $telegramID,
                    'firstname' => $dataUser['firstname'] ?? "",
                    'lastname' => $dataUser['lastname'] ?? "",
                    'lastname' => $dataUser['username'] ?? "",
                    'study_status' => 0,
                    'created_at' => date('d.m.Y H:i'),
                    'updated_at' => date('d.m.Y H:i'),
                ]
            );
        } else {
            $dataUser['updated_at'] = date('d.m.Y H:i');
            $userData->update($dataUser);
        }

        return static::where('id_telegram', $telegramID)->first();
    }

}

Модель ProgressStudy

В данную модель я добавил 2 метода:

  • changeProgressStudy() — для изменения информации о статусе «Прочитано» у статьи
  • getProgressStudy() — для получения списка статей добавленных в раздел «Прочитано»

Код модели:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class ProgressStudy extends Model
{
    protected $table = 'progress_study';

    protected $fillable = [
        'id_telegram',
        'progress_value',
        'created_at',
        'updated_at',
    ];

    /**
     * Изменение статуса "Прочитано"
     *
     * @param int $telegramID - id Telegram пользователя
     * @param int $idArticle - id записи
     * @return array
     */
    public static function changeProgressStudy(int $telegramID, int $idArticle): array
    {
        $progressStudyData = static::where('id_telegram', $telegramID)->first();

        if (empty($progressStudyData->progress_value)) {
            $progressValue = [];
            $progressValue[] = $idArticle;
        } else {
            $progressValue = json_decode($progressStudyData->progress_value, true) ?? [];
            if (!in_array($idArticle, $progressValue)) {
                $progressValue[] = $idArticle;
            } else {
                $progressValue = array_diff($progressValue, [$idArticle]);
            }
        }

        $progressValue = json_encode($progressValue);
        static::updateOrCreate(
            [
                'id_telegram' => $telegramID
            ],
            [
                'id_telegram' => $telegramID,
                'progress_value' => $progressValue,
                'updated_at' => date('d.m.Y H:i'),
            ]
        );

        return static::getProgressStudy($telegramID);
    }

    /**
     * Получение списка прочитанных записей
     *
     * @param int $telegramID - id Telegram пользователя
     * @return array
     */
    public static function getProgressStudy(int $telegramID): array
    {
        $progressStudy = ProgressStudy::where('id_telegram', $telegramID)->first();
        if (!empty($progressStudy)) {
            $progressStudy->progress_value = !empty($progressStudy->progress_value) ? json_decode($progressStudy->progress_value, true) : [];
        }

        return $progressStudy ?? [];
    }

}

Модель Favorite

В данную модель я добавил 2 метода:

  • changeFavorite() — для изменения информации о статусе «Прочитано» у статьи
  • getFavorite() — для получения списка статей добавленных в раздел «Прочитано»

Код модели:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Favorite extends Model
{
    protected $table = 'favorites';

    protected $fillable = [
        'id_telegram',
        'favorite_value',
        'created_at',
        'updated_at',
    ];

    /**
     * Изменение статуса "Избранное"
     * 
     * @param int $telegramID - id Telegram пользователя
     * @param int $idArticle - id записи
     * @return array
     */
    public static function changeFavorite(int $telegramID, int $idArticle): array
    {
        $favoriteData = static::where('id_telegram', $telegramID)->first();

        if (empty($favoriteData->favorite_value)) {
            $favoriteValue = [];
            $favoriteValue[] = $idArticle;
        } else {
            $favoriteValue = json_decode($favoriteData->favorite_value, true) ?? [];

            if (!in_array($idArticle, $favoriteValue)) {
                $favoriteValue[] = $idArticle;
            } else {
                $favoriteValue = array_diff($favoriteValue, [$idArticle]);
            }
        }

        $favoriteValue = json_encode($favoriteValue);
        static::updateOrCreate(
            [
                'id_telegram' => $telegramID
            ],
            [
                'id_telegram' => $telegramID,
                'favorite_value' => $favoriteValue,
                'updated_at' => date('d.m.Y H:i'),
            ]
        );

        return static::getFavorite($telegramID);
    }

    /** 
     * Получение списка записей добавленных в "Избранное"
     * 
     * @param int $telegramID - id Telegram пользователя
     * @return array
     */
    public static function getFavorite(int $telegramID): array
    {
        $favoriteData = Favorite::where('id_telegram', $telegramID)->first();
        if (!empty($favoriteData)) {
            $favoriteData->favorite_value = !empty($favoriteData->favorite_value) ? json_decode($favoriteData->favorite_value, true) : [];
        }

        return $favoriteData ?? [];
    }

}

Материалы курса