2015-05-18 55 views
2

這是我目前有:我怎樣才能寫這個,所以它只碰到數據庫一次?

$sortOrder = ['0','1','4','2','3']; 

$cards = ComboCard::where('username', '=', $user->username) 
    ->where('combo_uid', '=', $comboUid) 
    ->select('id', 'card_order') 
    ->orderBy('card_order', 'ASC') 
    ->get(); 

for($i=0; $i<count($cards); $i++) { // currently hits the database n times based on count($cards) 
    $index = $sortOrder[$i]; 
    $cards[$index]->card_order = $i; 
    $cards[$index]->save(); 
} 

回答

2

如果希望更新單獨的語句,你需要case

這就是說,你不會用口才,但原始連接update(asuming該數組中值是card_order - 我會用ids代替):

$cases = $bindings = []; 

foreach ($sortOrder as $new => $previous) { 
    $cases[] = 'when ? then ?'; 
    $bindings[] = $previous; 
    $bindings[] = $new; 
} 

// placeholders for the where in clause: ?,?,?,?,... 
$placeholders = implode(',', array_fill(0, count($sortOrder), '?')); 

// bindings for the where in clause 
$bindings = array_merge($bindings, $sortOrder); 

$sql = 'update `cards` set `card_order` = case `card_order` '.implode(' ', $cases).' end'. 
     ' where `card_order` in ('.$placeholders.')'; 

DB::update($sql, $bindings); 
相關問題