Laravel批量插入包含包含数组的列

时间:2017-10-03 07:01:09

标签: php arrays laravel laravel-5 eloquent

我的数据结构包含以下列:

id => increments()
name => string()
data => string()

在我的模型中,我将数据列转换为数组。

    protected $casts = [
    'data' => 'array'
    ];

在for循环中,我创建了一个名为$data的多维数组,并将其分配给我的$temp数组的数据键,并将其推送到名为$finals的数组中

$temp = [
'name' => $variable1,
'data' => $data
]

array_push($finals, $temp)

不幸的是,当我有一个多维数组时,Laravel的批量插入不允许我执行批量插入,其中一个值是数组。为了插入这种类型的多维数组,我必须创建以下foreach loop(我不喜欢)

foreach($finals, $final)
{
    ModalName::create($final);
}

有没有办法可以在单个语句中插入这样的数据结构,而不是循环遍历数组的每个元素。像

这样的东西
ModelName::create($finals);

请注意,我试图用硬编码的静态值代替数组替换'data'键的值,并正确插入行。

多维数组$ finals看起来像这样。

array:2 [
    0 => [
        'name' => 'name_value',
        'data' => [
            "key" => "value",
            "key2" => "value2"
           ]
    ]
   1 => [
        'name' => 'name_value2',
        'data' => [
              'key' => 'value',
              'key2' => 'value2'
            ]
    ]
]

修改::

请注意,当我尝试使用

ModelName::create($finals) or 
ModalName::insert($finals) or 
DB::table('table_name')->insert($finals)

我收到以下查询异常:数组到字符串转换

2 个答案:

答案 0 :(得分:1)

您可以使用

插入批量数组
Model::insert($array);

了解更多信息

<强>插入

查询构建器还提供了一种插入方法,用于将记录插入数据库表。 insert方法接受列名和值的数组:

DB::table('users')->insert(
    ['email' => 'john@example.com', 'votes' => 0]
);

您甚至可以通过传递一组数组,通过一次调用插入表中的几条记录。每个数组代表一个要插入表中的行:

DB::table('users')->insert([
    ['email' => 'taylor@example.com', 'votes' => 0],
    ['email' => 'dayle@example.com', 'votes' => 0]
]);

注意

这不会更新您需要在此处手动传递的created_atupdated_at

答案 1 :(得分:0)

将强制转换的字段/数据包装到json_encode中:

$insert = [
    0 => [
        'name' => 'name_value',
        'data' => json_encode([
            "key" => "value",
            "key2" => "value2"
           ])
    ]
   1 => [
        'name' => 'name_value2',
        'data' => json_encode([
              'key' => 'value',
              'key2' => 'value2'
            ])
    ]
]

然后插入:

Model::insert($insert);

这不会创建JSON STRING,但会保留结构,只要您在模型中具有此结构即可。

protected $casts = [
   'data' => 'array',
];