Красноречивый: мне нужно сделать этот запрос необработанным? - PullRequest
0 голосов
/ 19 декабря 2018

Я переписываю части устаревшего программного обеспечения, используя 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.

Вот как я сейчас это делаю, но raw 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 голосов
/ 19 декабря 2018

Мы нашли способ сделать это с помощью 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")
        )
    );
0 голосов
/ 19 декабря 2018

Честно говоря, это может быть проще, если использовать выражение 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()
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...