【问题标题】:insert multiple rows using join in a table在表中使用连接插入多行
【发布时间】:2018-07-22 21:25:12
【问题描述】:

我想通过单个查询使用连接在不同表中的表中插入多行。当我运行以下查询时,它显示错误

$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() 必须是数组类型,给定对象。

实际上它返回对象,其中插入方法需要数组。我使用了原始查询,它插入了数据,但没有填充时间戳,也没有返回插入的行数。

如何使用 laravel 查询生成器同时获得两者??

【问题讨论】:

  • 我认为的问题是您正在尝试插入从连接生成的值,因此问题..您需要确保您尝试添加的列应与表中定义的列匹配跨度>
  • @DhavalChheda 它匹配 columns.insert 方法需要数组,但从连接返回数组对象生成的值。

标签: php laravel-5.4 laravel-query-builder


【解决方案1】:

试试这个。如果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));

【讨论】:

  • created_at 和 updated_at 列没有填充。实际上我需要插入的行数和时间戳。
【解决方案2】:

首先您可以将第一个查询的结果存储在一个变量中:

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

最后将其插入数据库,假设列匹配。

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

【讨论】:

  • @Jimenez created_at 和 updated_at 列未填充。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2014-08-09
  • 2012-01-29
  • 2011-11-11
相关资源
最近更新 更多