0

How do I transform this

DB::table('partners')->insert(array($data));

laravel Query to have ON DUPLICATE KEY UPDATE

the structure look like

$data['program_name'] = $program['program']['_'];
$data['program_id'] = $program_id;
$data['status'] = $program['status'];
$data['shop_name'] = $shop->name;
$data['shop_logo'] = $shop->image;
$data['shop_description'] = $shop->description;

where program_id is unique

fefe
  • 8,755
  • 27
  • 104
  • 180

2 Answers2

3

Use something like this (feel free to correct because it's untested):

DB::statement( 'INSERT INTO partners VALUES (' . implode( ',',
    array_map( function( $val ) { return ":$val"; } , array_keys($data) )
) . ') ON DUPLICATE KEY UPDATE ' . implode( ',',
    array_map( function( $val ) { return "$val = VALUES($val)"; } , array_keys($data) )
), $data);
Dmitriy Sintsov
  • 3,821
  • 32
  • 20
0

I created a package that will wrapped INSERT ON DUPLICATE KEY UPDATE

https://packagist.org/packages/yadakhov/insert-on-duplicate-key

$users = [
   ['id' => 1, 'email' => 'user1@email.com', 'name' => 'User One'],
   ['id' => 2, 'email' => 'user2@email.com', 'name' => 'User Two'],
   ['id' => 3, 'email' => 'user3@email.com', 'name' => 'User Three'],
];

User::insertOnDuplicateKey($users);

// produces:

INSERT INTO `test_user_table`(`id`,`email`,`name`) VALUES
(1,'user1@email.com','User One'), (2,'user3@email.com','User Two'), (3,'user3email.com','User Three')
ON DUPLICATE KEY UPDATE `id` = VALUES(`id`), `email` = VALUES(`email`), `name` = VALUES(`name`)
Yada
  • 30,349
  • 24
  • 103
  • 144