我希望使用单个查询的连接在不同表中的表中插入多行。当我运行以下查询时,它显示错误
$insert=DB::table('tableA')->insert(DB::raw('SELECT ss.col1,ts.col2,ts.col3,ts.col4,ts.col5,
5 AS col6 FROM
tableB AS ts
INNER JOIN tableC AS t ON ts.col2=t.id
INNER JOIN tableD AS ss
ON ts.col1=ss.col1
AND ts.col3=ss.col3
AND ts.col4=ss.col4
AND ts.col5=ss.col5
INNER JOIN tableE AS s
ON ss.col1=s.id
WHERE t.status=1
AND s.status=1'));
错误:参数1传递给Illuminate \ Database \ Query \ Builder :: insert() 必须是类型数组,给定对象。
实际上它返回对象,其中insert方法需要数组。我使用原始查询它插入数据但时间戳没有填充,它也不会返回插入的行数。
如何使用laravel查询构建器获取两者?
答案 0 :(得分:0)
试试这个。如果tableA
中的列与您的选择中的列名相同,则会有效:
$insert=DB::table('tableA')
->insert(json_decode(json_encode(DB::select('SELECT ss.col1,ts.col2,ts.col3,ts.col4,ts.col5,
5 AS col6 FROM
tableB AS ts
INNER JOIN tableC AS t ON ts.col2=t.id
INNER JOIN tableD AS ss
ON ts.col1=ss.col1
AND ts.col3=ss.col3
AND ts.col4=ss.col4
AND ts.col5=ss.col5
INNER JOIN tableE AS s
ON ss.col1=s.id
WHERE t.status=1
AND s.status=1')),true));
答案 1 :(得分:0)
首先,您可以将第一个查询的结果存储在变量中:
$data = DB::select('SELECT ss.col1,ts.col2,ts.col3,ts.col4,ts.col5,
5 AS col6 FROM
tableB AS ts
INNER JOIN tableC AS t ON ts.col2=t.id
INNER JOIN tableD AS ss
ON ts.col1=ss.col1
AND ts.col3=ss.col3
AND ts.col4=ss.col4
AND ts.col5=ss.col5
INNER JOIN tableE AS s
ON ss.col1=s.id
WHERE t.status=1
AND s.status=1');
然后将数据转换为数组:
$data = collect($data)->map(function($x){ return (array) $x; })->toArray();
最后将其插入到DB中,假设列匹配。
$insert = DB::table('tableA')->insert($data);
您可以使用此代码推送timestamps
字段的值,假设这两个字段是表格规范的末尾,确保列与值匹配:
$data = collect($data)->map(function($x){
return array_push((array) $x, date('Y-m-d H:i:s'), date('Y-m-d H:i:s'));
})->toArray();