В laravel 5.1 есть новая функция под названием Attribute Casting, которая хорошо документирована здесь:
http://laravel.com/docs/5.1/eloquent-mutators#attribute-casting
Мой вопрос, возможно ли динамическое приведение атрибутов?
например, у меня есть таблица со столбцами:
id | name | value | type |
1 | Test_Array | [somearray] | array |
2 | Test_Boolean | someboolean | boolean |
можно установить value
Атрибут приведение, зависит от type
поле, которое работает как в записи (создание / обновление) и выборки?
Вам нужно будет перезаписать Eloquent модели getCastType () метод в вашем модельном классе:
protected function getCastType($key) {
if ($key == 'value' && !empty($this->type)) {
return $this->type;
} else {
return parent::getCastType($key);
}
}
Вам также нужно будет добавить значение в $ This-> слепков так что Eloquent распознает это поле как литьевой. Вы можете поместить каст по умолчанию, который будет использоваться, если вы не установили тип.
Обновить:
Вышеописанное прекрасно работает при чтении данных из базы данных. При записи данных, вы должны убедиться, что тип установлен раньше значение. Есть 2 варианта:
Всегда передавать массив атрибутов, где тип ключ приходит раньше значение ключ — на данный момент модель заполнить () Метод учитывает порядок ключей при обработке данных, но не ориентирован на будущее.
Точно установлено тип атрибут перед установкой других атрибутов. Это легко сделать с помощью следующего кода:
$model == (new Model(['type' => $data['type']))->fill($data)->save();
$casts
Атрибут используется, когда вы обращаетесь к полю, а не когда он извлекается из базы данных. Поэтому вы можете обновить $casts
атрибута после заполнения модели, и он должен нормально работать при каждом доступе к value
поле. Вам просто нужно выяснить, как обновить $casts
атрибут, когда type
поле изменено
Одним из возможных вариантов будет переопределение fill()
метод, так что он вызывает родителя fill()
метод, а затем обновляет $casts
атрибут с данными в type
поле.
Другим потенциальным вариантом будет злоупотребление функциональностью мутатора и создание мутатора на type
поле, так что всякий раз, когда он изменяется, он обновляет $casts
приписывать.