我正在使用laravel / eloquent重写旧版软件的一部分。
我对典型的雄辩有很好的理解,我已经在laravel中完成了一些项目,但对于遗留代码却做得不多。
我正在尝试雄辩地创建79行:
INSERT IGNORE INTO `ps_module_shop` (`id_module`, `enable_device`, id_shop) (SELECT `id_module`, `enable_device`, 555 FROM ps_module_shop WHERE `id_shop` = 1);
我已经读到您只能使用model::insert
进行批量插入,但是除了纯sql之外,我不确定如何使用此查询来进行此操作。
这是我目前的操作方式,但是对于此查询,原始sql感觉更优雅:
$blkInsert = [];
$tplModuleShop = ModuleShop::where('id_shop', 1)->get();
foreach($tplModuleShop as $mshop) {
$blkInsert[] = [
'id_module' => $mshop->id_module,
'enable_device' => $mshop->enable_device,
'id_shop' => $shop->id_shop,
];
}
ModuleShop::insert($blkInsert);
注意:我知道这是一个数据透视表,但是它是使用复合键的旧式数据库,因此我决定将其视为自己的模型。
答案 0 :(得分:0)
老实说,使用您的sql语句可能会更容易...这是我的尝试:
DB::table('ps_model_shop')
->insert(DB::table('ps_module_shop')
->select(['id_module', 'enable_device'])
->where('id_shop', 1)
->get()
->map(function($module){
$module['id_shop'] = 555;
})
->toArray()
);
答案 1 :(得分:0)
我们找到了一种使用DB :: select的方法(尽管仍然执行sql部分“ raw”)
$fixCollection = function($collection) {
return json_decode(json_encode($collection), true);
};
ModuleShop::insert(
$fixCollection(
\DB::select("SELECT `id_module`, `enable_device`, {$shop->id_shop} as id_shop FROM ps_module_shop WHERE `id_shop` = 1")
)
);