首页 > 解决方案 > Eloquent:我需要直接做这个查询吗?

问题描述

我正在使用 laravel/eloquent 重写部分遗留软件。

我对典型的 eloquent 的理解很好,我在 laravel 中做过一些项目,但对于遗留代码并没有那么多。

我正在尝试用 eloquent 来创建 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);

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

标签: laraveleloquent

解决方案


老实说,这可能只是使用你的 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()
    );

推荐阅读