Для работы с нашими сущностями, необходимо создать модели. Модели создаются отталкиваясь от названия таблицы (в единственном числе).
Таким образом, нам нужно создать следующие модели:
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 ?? [];
}
}