2014-11-28 2 views
2

У меня есть такой код:Connect 2 запросы к 1

$id = 5; 
$a = 1; 
$b = ($a === 2 ? 1 : 2); 

DB::table('table')->where('id', $id)->where('value', $a)->update(['new_value' => 1]); 
DB::table('table')->where('id', $id)->where('value', $b)->update(['new_value' => 2]); 

Можно ли сделать это 2 запросов в 1?

+0

Спасибо за ответ @tanaydin. Я так думаю, но я хочу знать, что это возможно или нет. – exexe

+0

Вы можете это сделать, конечно, используя 'WHEN .. THEN', вы можете динамически строить этот запрос, если существует переменное число этих значений. @JosephSilber дал вам ответ ниже. –

ответ

3

Вы не можете использовать построитель запросов для этого. Используйте вместо этого DB::statement:

DB::statement('UPDATE table SET new_value = CASE 
       WHEN value = ? THEN ? 
       WHEN value = ? THEN ? 
       END WHERE id = ?', [ 
    $a, 1, 
    $b, 2, 
    $id, 
]); 
+0

Это путь, я просто добавлю «ELSE new_value» в качестве резервного. И, кстати, вы можете сделать это с помощью 'Query \ Builder', просто предоставляя' DB :: raw ('case ...') 'методу' update() '. –

+0

@JarekTkaczyk - Метод 'update' ожидает массив. –

+0

точно: '-> update (['new_value' => DB :: raw (" case ... ")]);' –

0

В MySQL запросе можно достичь с помощью ниже запроса:

$mysqlQuery = "UPDATE table1 
SET new_value = IF(id=".$id ." AND value=".$a.",1, IF(id=".$id." AND value=".$b.",2,new_value))"; 

Note:If you want this mysql query to be written in some framework specific query then you can convert it as per your framework syntax or documentation. 
0

AFAIK, а не с Laravel свободно. Существует два разных запроса с разными значениями обновления. Однако вы можете использовать его в функции многократного использования.

public function updateNewValue($id, $value, $newValue) 
{ 
    return DB::table('table') 
     ->where('id', $id) 
     ->where('value', $value) 
     ->update(['new_value' => $newValue]); 
} 

Или, вы можете объединить их в один с переключателем заявления в зависимости от new_value:

$query = DB::table('table')->where('id', $id); 

switch($newValue) 
{ 
    case 1: 
     return $query->where('value', $a)->update(['new_value' => $newValue]); 
    case 2: 
     return $query->where('value', $b)->update(['new_value' => $newValue]); 
}