Laravel 5.8 model casts

120
26 января 2021, 08:20

Набрёл на странное (для меня) поведения модели в Laravel: при изменении атрибутов с помощью метода модели fill($data), преобразования по свойству $casts напрочь игнорируются.

class User extends Model
{
   protected $casts = [
      'value' => 'integer',
   ];
}
$user = User::find(1);
$user->fill(['value'=> '1']);
is_int($user->value);   // false

Но если идёт присвоение через обращение напрямую, то всё работает.

$user = User::find(1);
$user->value = '1';
is_int($user->value);   // true;

Как костыль можно использовать

    public function setValueAttribute($value)
    {
        $this->attributes['value'] =  filter_var($value, FILTER_VALIDATE_INT);
    }

Но это костыль... Или может я делаю что-то не так?

Answer 1

Я думаю в первом случае, вы пытаетесь через fill добавить данные в несуществующее св-во класса. Во втором случае вы объявляете св-во явно. Т.о. через маг. метод он у вас создаётся и заполняется. В 3-ем случае, всё тоже самое что и во втором. Явное объявление св-ва value.

Answer 2

Если Вы заполняете (изменяете) свойства объекта модели через create() или fill(), то необходимо добавлять в модель protected $fillable = ['value']. То есть, получается mass assignable как в документации, так как присваиваете массив на вход функции fill, а значит должно быть указано данное свойство. Проверяется guarded и не вызывается $casts. Предположу что такое поведение по этой причине.

READ ALSO
Spring Tomcat архитектура

Spring Tomcat архитектура

Задача приложения - работать со сторонним RESTfull сервисомВзаимодействие включает в себя обмен JSON сообщениями + по запросу стороннего сервиса,...

176
Как определить тип диска (FileStore) в Windows?

Как определить тип диска (FileStore) в Windows?

Для объектов типа FileStore в Windows стандартными и широко известными методами легко определяется метка и буква тома, объем диска и свободного места,...

146
Масштабирование ImageView

Масштабирование ImageView

Как можно реализовать ImageView c возможностью касаниями масштабировать изображения?(так же как в обычных фото галереях?)

148
Selenium и вложенные html-страницы

Selenium и вложенные html-страницы

Дело было вечером, делать было нечего

174