在Laravel app的数据库中存储数组或std对象

时间:2014-02-09 12:16:51

标签: arrays laravel

数据库表在列中存储Array或stdObject的架构是什么?

当我使用 - >字符串并插入数组变量时,它只在db列中存储单词“Array”。

Laravel是否支持数组?

如果不是,我应该采用什么方法?

2 个答案:

答案 0 :(得分:48)

您可以将序列化数据保存/插入TEXT类型字段,但为此您必须使用php,例如:

$arr = array('x', 'y', 'z');

要将其插入数据库字段,您可以使用serialize这样的功能

$serializedArr = serialize($arr);

现在,您可以将$serializedArr数组插入到数据库中,当您检索要使用的数据时,只需unserialize使用类似的数据:

$record = SomeModel::find(1);
unserialize($record->field_name);

此外,您可以使用Laravel的accessors-and-mutators使整个事情自动化,查看手册,这很简单。如果您需要有关此accessors-and mutators的更多帮助,请留言,其中包含table个详细信息。

<强>更新

由于Laravel 5.x允许attribute casting,因此可以将属性转换为另一种数据类型,以便在运行时进行转换。在这种情况下,只需声明protected $casts属性,例如:

protected $casts = [
    'is_admin' => 'boolean', // Will convarted to (Bool)
    'options' => 'array', // Will convarted to (Array)
];

array强制转换对于处理存储为序列化JSON的列特别有用。例如,如果您的数据库具有包含序列化JSON的TEXT类型字段,那么当您在{{1}上访问该属性时,将该属性添加到该属性将自动将该属性反序列化为PHP数组。当你为这个属性设置值时,它会被自动序列化回Eloquent,例如:

JSON

答案 1 :(得分:8)

自Laravel 5.1以来,最好的办法就是像这样对你的桌面进行搜索:

class Mytable extends Model
{
    /**
     * The attributes that should be casted to native types.
     *
     * @var array
     */
    protected $casts = [
        'my_field' => 'array',
    ];

阅读有关Laravel official documents page的属性转换的更多信息。 引用:

  

模型上的$ casts属性提供了一种方便的方法   将属性转换为常见数据类型。 $ casts属性应该   是一个数组,其中键是要转换的属性的名称,   而值是您希望转换为列的类型。该   支持的强制类型是:整数,实数,浮点数,双精度,字符串,   布尔值,对象,数组,集合,日期和日期时间

文档没有说明的唯一限制不能直接使用此数组,就像这样

$myTable.my_field[]='new array element';

相反,您必须单独准备数组,然后将其分配给字段,如下所示:

$temp=[];
$temp[]='new array element';
$myTable.my_field[]=$temp;

如果您使用旧版本的Laravel,请使用 The Alpha 提供的答案,或者更好,退出您的工作:)。