我有两张桌子:
qr_详情表:
id product_id qrcode_id created_at updated_at
1 1 12 2017-10-09 15:36:15 2017-10-09 15:36:15
2 3 13 2017-10-09 15:36:15 2017-10-09 15:36:15
获奖者表:
id product_id qrcode_id winner_name win_number created_at updated_at
1 1 12 hello 5 2017-10-09 15:36:15 2017-10-09 15:36:15
2 3 13 world 6 2017-10-09 15:36:15 2017-10-09 15:36:15
现在我想将
qr_details
表 product_id
和 qrcode_id
放入 winners
表中。我如何通过 Laravel 中的查询来做到这一点?我已经制作了一个 SQL Fiddle here。 提前致谢。
我相信你可以做这样的事情:
$query = \DB::connection()->getPdo()->query("select * from qr_details");
$data = $query->fetchAll(\PDO::FETCH_ASSOC);
\DB::table('winners')->insert($data);
需要一点时间,只需两个查询
我不太明白你的问题,但你可以试试这个:
$datas = DB::table('qr_details ')->get();
foreach($datas as $data){
DB::table('winners')->insert(['qrcode_id' => $data->qrcode_id, 'product_id'=>$data->product_id, ...bunch other inserts])
}
如果您要向
winners
表添加新记录,那么您可以使用 Eloquent
模型和 insert
方法在单个查询中添加多条记录。
$qcodes = Qrcode::all()->map(function(Qrcode $qrcode) {
return [
'id' => $qrcode->id,
'product_id' => $qrcode->product_id,
'qrcode_id' => $qrcode->qrcode_id,
'winner_name' => 'some name',
'win_number' => 5
];
});
Winner::insert($qcodes);
但是,从您所说的猜测,这可能不是您想要的 - 因为您只想添加
product_id
和 qrcode_id
- 换句话说,更新现有记录。
如果是这种情况,并且如果您的
id
列在两个表中都匹配,那么您可以执行类似以下操作:
$qcodes = Qrcode::all();
$qcodes->each(function(Qrcode $qrcode) {
Winner::where('id', $qrcode->id)->update([
'product_id' => $qrcode->product_id,
'qrcode_id' => $qrcode->qrcode_id
]);
});
这再次假设您正在使用
Eloquent
模型 - 否则您必须使用 Query Builder
:
$qcodes= DB::table('qr_details')->get();
$qcodes->each(function(Qrcode $qrcode) {
DB::table('winners')
->where('id', $qrcode->id)
->update([
'product_id' => $qrcode->product_id,
'qrcode_id' => $qrcode->qrcode_id
]);
});
确保相应地更新表/模型名称。
现在,您的sql结构的一个问题是您的
winners
表product_id
和qrcode_id
是NOT NULL
,因此在第一次创建记录时它必须有一些数据。如果您要更新这些记录,我建议将这两列更改为 NULL
,以便最初它们不需要任何数据。
我知道这么晚了,但有人在寻找解决方案,你可以使用
chunk
laravel 函数。您的表有大量记录,请考虑使用批处理方法来避免内存问题。
Table1::chunk(200, function ($table1Data) {
foreach ($table1Data as $record) {
// Create and save records in table2
}
});