简体   繁体   English

在表中使用连接插入多行

[英]insert multiple rows using join in a table

I want to insert multiple rows in a table from different tables using join by a single query.When I run the below query it shows error 我想通过单个查询使用连接从不同表的表中插入多行。当我运行以下查询时,它显示错误

$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'));

Error:Argument 1 passed to Illuminate\\Database\\Query\\Builder::insert() must be of the type array, object given. 错误:传递给Illuminate \\ Database \\ Query \\ Builder :: insert()的参数1必须是给定对象的数组类型。

actually it return object where as insert method expects array. 实际上,它返回的对象是插入方法所期望的数组。 I used raw query it inserts the data but timestamp doesn't populate and it doesn't return the inserted rows count as well. 我使用原始查询来插入数据,但不会填充时间戳,也不会返回插入的行数。

how can I get both using laravel query builder ?? 如何使用laravel查询生成器同时获取两者?

Try this. 尝试这个。 It will work if columns in tableA have the same names as in your select: 如果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));

First you can store the result of the first query in a variable: 首先,您可以将第一个查询的结果存储在变量中:

$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');

Then convert the data to array: 然后将数据转换为数组:

$data = collect($data)->map(function($x){ return (array) $x; })->toArray();

And finally insert it into DB, supposing the columns match. 最后,假设列匹配,将其插入DB。

$insert = DB::table('tableA')->insert($data);

EDIT 编辑

You can use this code to push the values for timestamps fields, supposing this two fields are ate the end of the table's specification, ensuring the columns match with values: 您可以使用此代码推送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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM