Введение
Laravel — это мощный PHP- фреймворк, и все его возможности сопряжены с большими обязанностями. В сегодняшней статье мы узнаем, как активировать строгий режим Eloquent в вашем приложении Laravel и как использовать его в своих интересах.
Предотвращение ленивой загрузки
Lazy Loading – это получение родителя model
и его дочерних элементов.
Например, у вас есть модель Post
, у которой много комментариев , что-то вроде:
class Post extends Model
{
// ...
public function comments()
{
return $this->hasMany(Comment::class);
}
}
Чтобы получить комментарии для конкретной модели, вам потребуется доступ к отношениям комментариев .
$post = Post::find(1);
$post->comments // return the comments collection.
Но давайте остановимся здесь на минутку. Если вы взглянете на запрос за сценой, вы заметите проблему N+1.
SELECT * FROM `comments` WHERE `comments`. `id` = 1;
SELECT * FROM `comments` WHERE `comments`. `id` = 2;
SELECT * FROM `comments` WHERE `comments`. `id` = 3;
SELECT * FROM `comments` WHERE `comments`. `id` = 4;
...
Допустим, у вас 1000 комментариев, этот запрос будет повторяться 1000 раз. Чтобы этого не произошло, вы будете использовать функцию отложенной загрузки.
$post = Post::find(1);
$post->with('comments')->comments;
Этот with()
метод будет использовать in
встроенную функцию MySQL для получения всех комментариев в одном запросе.
SELECT * FROM `comments` WHERE `comments` . `id` in (1,2,3,4,5,6,...1000)
Разработчики могут забыть об этой проблеме в процессе разработки, что бы этого не произошло в Laravel есть специальная функция.
В boot
метод вашего AppServiceProvider.php
добавьте следующие строки:
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Добавьте ! $this->app->isProduction()
что бы не показывать ошибки в продакшн среде.
Предотвращение молчаливого удаления атрибутов
Я знаю , что в Laravel появилась еще одна функция строгого режима — «Предотвращение тихого удаления атрибутов ». Давайте разберемся с этим.
Когда вы вставляете новую запись в базу данных через model
, вы просто добавляете атрибуты или, можно сказать, столбцы таблицы в fillable массив, примерно так:
class User extends Model
{
protected $fillable = [
'name',
'email',
];
}
Допустим, вы добавили, gender
например, еще один столбец и забыли добавить его в fillable
свойство, Laravel молча игнорирует, что нового атрибута нет в fillable
атрибутах, и просто добавляет его.
Чтобы предотвратить это и убедиться, что все атрибуты находятся в fillable
свойстве массива, при разработке приложения вы можете найти метод boot
в AppServiceProvider.php
и добавить следующее:
public function boot()
{
Model::preventSilentlyDiscardingAttributes(! $this->app->isProduction());
}
Запретить доступ к отсутствующим атрибутам
При разработке приложения Laravel вы можете заметить, что при доступе к отсутствующему атрибуту Laravel в результате возвращает NULL .
Допустим, у вас есть User
Модель, contains name
и email
a password
, и вы хотите получить доступ к чему-то вроде gender
, но оно не существует в базе данных как свойство
$user = User::find(1);
$user->gender // will returns null by default
Чтобы этого не произошло, вы можете добавить в boot
метод следующее:
Model::preventAccessingMissingAttributes(! $this->app->isProduction());
Все в одном
Если вам понравилось то, что вы видели выше, и вы хотите включить все 3 функции одновременно, вы можете добавить следующую строку:
Model::shouldBeStrict(! $this->app->isProduction());
Заключение
В этой статье мы обсудили 3 типа строгого режима модели в Laravel и способы его реализации в вашей базе кода, и если вы хотите включить все 3 одновременно, вы можете использовать метод mustBeStrict.