雄辩的:我是否需要原始查询?

时间:2018-12-19 19:48:46

标签: laravel eloquent

我正在使用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);

注意:我知道这是一个数据透视表,但是它是使用复合键的旧式数据库,因此我决定将其视为自己的模型。

2 个答案:

答案 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")
        )
    );