Набрёл на странное (для меня) поведения модели в 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);
}
Но это костыль... Или может я делаю что-то не так?
Я думаю в первом случае, вы пытаетесь через fill добавить данные в несуществующее св-во класса. Во втором случае вы объявляете св-во явно. Т.о. через маг. метод он у вас создаётся и заполняется. В 3-ем случае, всё тоже самое что и во втором. Явное объявление св-ва value.
Если Вы заполняете (изменяете) свойства объекта модели через create() или fill(), то необходимо добавлять в модель protected $fillable = ['value']
. То есть, получается mass assignable
как в документации, так как присваиваете массив на вход функции fill
, а значит должно быть указано данное свойство. Проверяется guarded
и не вызывается $casts
. Предположу что такое поведение по этой причине.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Задача приложения - работать со сторонним RESTfull сервисомВзаимодействие включает в себя обмен JSON сообщениями + по запросу стороннего сервиса,...
Для объектов типа FileStore в Windows стандартными и широко известными методами легко определяется метка и буква тома, объем диска и свободного места,...
Как можно реализовать ImageView c возможностью касаниями масштабировать изображения?(так же как в обычных фото галереях?)