Laravel 5 Eloquent, Как динамически установить атрибут приведения

В 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 поле, которое работает как в записи (создание / обновление) и выборки?

3

Решение

Вам нужно будет перезаписать Eloquent модели getCastType () метод в вашем модельном классе:

protected function getCastType($key) {
if ($key == 'value' && !empty($this->type)) {
return $this->type;
} else {
return parent::getCastType($key);
}
}

Вам также нужно будет добавить значение в $ This-> слепков так что Eloquent распознает это поле как литьевой. Вы можете поместить каст по умолчанию, который будет использоваться, если вы не установили тип.

Обновить:

Вышеописанное прекрасно работает при чтении данных из базы данных. При записи данных, вы должны убедиться, что тип установлен раньше значение. Есть 2 варианта:

  1. Всегда передавать массив атрибутов, где тип ключ приходит раньше значение ключ — на данный момент модель заполнить () Метод учитывает порядок ключей при обработке данных, но не ориентирован на будущее.

  2. Точно установлено тип атрибут перед установкой других атрибутов. Это легко сделать с помощью следующего кода:

    $model == (new Model(['type' => $data['type']))->fill($data)->save();
    
4

Другие решения

$casts Атрибут используется, когда вы обращаетесь к полю, а не когда он извлекается из базы данных. Поэтому вы можете обновить $casts атрибута после заполнения модели, и он должен нормально работать при каждом доступе к value поле. Вам просто нужно выяснить, как обновить $casts атрибут, когда type поле изменено

Одним из возможных вариантов будет переопределение fill() метод, так что он вызывает родителя fill() метод, а затем обновляет $casts атрибут с данными в type поле.

Другим потенциальным вариантом будет злоупотребление функциональностью мутатора и создание мутатора на type поле, так что всякий раз, когда он изменяется, он обновляет $casts приписывать.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector