Laravel强制转换数组仍然返回字符串

时间:2019-05-17 21:30:43

标签: php laravel laravel-5

检索列时,我希望将其作为数组获取,但是它以字符串形式返回。

迁移

$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 个答案:

答案 0 :(得分:1)

如果您将模型配置为将属性强制转换为array,则在尝试存储它时无需将其转换回json,Laravel会为您处理。来自docs

  

Array & 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();

答案 1 :(得分:0)

您可以删除演员表并在Exchange模型上实现accessor方法:

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

并按照自己的意愿正常消费:

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