在Laravel应用程序中将数组或标准对象存储到数据库中。

43

如何在数据库表中存储数组或stdObject?

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

Laravel是否支持数组?

如果不支持,则应该实现什么方法?

2个回答

82

你可以将序列化数据保存/插入到一个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'];

2
谢谢,确实非常简单,使用访问器和修改器,在我的情况下非常适用。 - Matthias S
1
@YevgeniyAfanasyev,当时还没有casting的时候已经给出了答案,但现在可以直接进行cast - The Alpha
1
@TheAlpha,谢谢你,我不知道强制类型转换不可用。对我来说,这感觉很自然。即使使用原始的PHP,我仍然这样做。 - Yevgeniy Afanasyev
1
@MN,请检查unserialize($record->field_name)的返回值,或者像这样进行操作 $data = (array) unserialize($record->field_name),如果您期望得到一个数组。 - The Alpha
1
@The Alpha,非常感谢。(array)解决了我的问题。 - Mostafa Norzade
显示剩余4条评论

16

自 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提供的答案,或者更好的选择是辞掉您的工作:)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接