如何在数据库表中存储数组或stdObject?
使用->string并插入数组变量时,它只在db列中存储单词“Array”。
Laravel是否支持数组?
如果不支持,则应该实现什么方法?
你可以将序列化数据保存/插入到一个TEXT
类型的字段中,但是为了做到这一点,你需要使用php
进行操作,例如:
您可以在php
中使用serialize()
函数将数据序列化,并在将其存储到数据库之前将其编码为base64字符串。然后,在从数据库获取该数据时,您可以使用base64_decode()
和unserialize()
函数来解码并反序列化该数据。
$arr = array('x', 'y', 'z');
要将此插入数据库字段,您可以使用 serialize 函数,如下所示:
$serializedArr = serialize($arr);
现在,您可以将$serializedArr
数组插入到数据库中,当您检索数据以使用时,只需使用类似以下内容的unserialize来解序列化它:$record = SomeModel::find(1);
unserialize($record->field_name);
此外,您可以使用Laravel的访问器和修改器来实现整个过程的自动化,查看手册更容易了解。如果您需要有关此“访问器和修改器”的更多帮助,则可以在留言中留下您的“表”详细信息。
更新:
由于Laravel 5.x
允许属性转换,因此可以将属性转换为另一种数据类型以在运行时进行转换。在这种情况下,只需声明一个protected $casts
属性,例如:
protected $casts = [
'is_admin' => 'boolean', // Will convarted to (Bool)
'options' => 'array', // Will convarted to (Array)
];
array
转换特别适用于处理存储为序列化JSON
的列。例如,如果您的数据库有一个包含序列化JSON的TEXT
类型字段,在该属性上添加数组转换将在访问Eloquent
模型上的此属性时自动将该属性反序列化为PHP
数组;并且当您设置值到此属性时,它将自动序列化回JSON
格式,例如:
$user = User::find(1);
// $options is an array...
$options = $user->options;
// options is automatically serialized back to JSON...
$user->options = ['foo' => 'bar'];
自 Laravel 5.1 版本以来,最佳的方法是将您的表字段进行 CAST 如下:
class Mytable extends Model
{
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'my_field' => 'array',
];
在Laravel官方文档页面中了解有关属性转换的更多信息。
您的模型上的$casts属性提供了一种将属性转换为常见数据类型的便捷方法。 $casts属性应该是一个数组,其中键是要转换的属性名称,而值是要转换为列的类型。支持的转换类型有:integer、real、float、double、string、boolean、object、array、collection、date和datetime。
文档没有提到的唯一限制是不能直接使用此数组进行操作,例如:
$myTable.my_field[]='new array element';
相反,你需要单独准备数组,然后将其分配给字段,像这样:
$temp=[];
$temp[]='new array element';
$myTable.my_field[]=$temp;
如果您使用的是较旧版本的Laravel,请使用由The Alpha提供的答案,或者更好的选择是辞掉您的工作:)。
casting
的时候已经给出了答案,但现在可以直接进行cast
。 - The Alphaunserialize($record->field_name)
的返回值,或者像这样进行操作$data = (array) unserialize($record->field_name)
,如果您期望得到一个数组。 - The Alpha(array)
解决了我的问题。 - Mostafa Norzade