簡體   English   中英

在表中使用連接插入多行

[英]insert multiple rows using join in a table

我想通過單個查詢使用連接從不同表的表中插入多行。當我運行以下查詢時,它顯示錯誤

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

錯誤:傳遞給Illuminate \\ Database \\ Query \\ Builder :: insert()的參數1必須是給定對象的數組類型。

實際上,它返回的對象是插入方法所期望的數組。 我使用原始查詢來插入數據,但不會填充時間戳,也不會返回插入的行數。

如何使用laravel查詢生成器同時獲取兩者?

嘗試這個。 如果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));

首先,您可以將第一個查詢的結果存儲在變量中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM