Литой массив Laravel по-прежнему возвращает строку - PullRequest
1 голос
/ 18 мая 2019

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

Миграция

$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 ]

1 голос
/ 18 мая 2019

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

Массив и JSON Casting

...

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

$user = App\User::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();
0 голосов
/ 18 мая 2019

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

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

И потребляй как хочешь:

foreach($exchanges as $ex)
   echo gettype($ex->balance)
endforeach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...