Литой массив Laravel по-прежнему возвращает строку

При получении столбца я хотел бы получить его в виде массива, однако он возвращается в виде строки.

миграция

$table->text('balance')->nullable();

На модели (согласно документам Laravel)

protected $casts = [
   'balance' => 'array',
];

При сохранении данных в столбце баланса

$exchange = Exchange::findOrFail($id);
$exchange->balance = json_encode($balance);
$exchange->save();

При получении модели

$exchanges = Exchange::orderBy('title')->get();

В представлении

foreach($exchanges as $ex)
   echo gettype($ex->balance) // This returns string, not an array
endforeach

Я озадачен тем, почему это все еще строка, а она должна быть массивом. Я также пробовал json вместо типа text столбца в миграции, тот же результат.

Всего 2 ответа


Если вы конфигурируете свою модель для приведения атрибута к array , вам не нужно преобразовывать его обратно в json при попытке сохранить его, Laravel позаботится об этом за вас. Из документов :

Массив и JSON Casting

...

Как только приведение приведено, вы можете получить доступ к атрибуту options и он будет автоматически десериализован из JSON в массив PHP. Когда вы устанавливаете значение атрибута options , данный массив автоматически сериализуется обратно в JSON для хранения:

$user = AppUser::find(1);

$options = $user->options;

$options['key'] = 'value'

$user->options = $options;

$user->save();

Итак, в вашем случае:

$exchange = Exchange::findOrFail($id);
$exchange->balance = ['your', 'values', 'as', 'an', 'array'];
$exchange->save();

Вы можете удалить приведение и реализовать метод доступа на модели Exchange :

public function getBalanceAttribute($value)
{
    return json_decode($value);
}

И потреблять нормально, как вы хотите:

foreach($exchanges as $ex)
   echo gettype($ex->balance)
endforeach

Есть идеи?

10000