Набрёл на странное (для меня) поведения модели в 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. Предположу что такое поведение по этой причине.
Продвижение своими сайтами как стратегия роста и независимости