前提・実現したいこと
arrayのold_orderとDBのorderをマッチさせて、DBを一括でnew_orderの値に更新したいです。
foreachで試しましたが、上手くできませんでした。
他の方法も見つからずに困っています。
解決できる方法があればご教授いただきたいです。
よろしくお願いします。
array
1array:3 [ 2 0 => array:3 [ 3 "type" => 1 4 "new_order" => 2 5 "old_order" => 1 6 ] 7 1 => array:3 [ 8 "type" => 1 9 "new_order" => 3 10 "old_order" => 2 11 ] 12 2 => array:3 [ 13 "type" => 1 14 "new_order" => 1 15 "old_order" => 3 16 ] 17]
DB
1update前 2+------+-------+ 3| type | order | 4+------+-------+ 5| 1 | 1 | 6| 1 | 2 | 7| 1 | 3 | 8+------+-------+ 9 10update後 11+------+-------+ 12| type | order | 13+------+-------+ 14| 1 | 2 | 15| 1 | 3 | 16| 1 | 1 | 17+------+-------+
試したこと
foreachを使って下記の流れで更新しましたが、組み合わせによって意図しない更新が発生してしました。
- new_orderとマッチするorderを0に更新
- old_orderとマッチするorderをnew_orderに更新
- orderが0のorderをold_orderに更新
php
1$array = [ 2 0 => array:3 [ 3 "type" => 1 4 "new_order" => 2 5 "old_order" => 1 6 ] 7 1 => array:3 [ 8 "type" => 1 9 "new_order" => 3 10 "old_order" => 2 11 ] 12 2 => array:3 [ 13 "type" => 1 14 "new_order" => 1 15 "old_order" => 3 16 ] 17] 18 19foreach ($array as $value){ 20 $db = DB::table("order_number") 21 ->where("order_number.type","=", $value["type"]) 22 ->where("order_number.order","=", $value["old_order"]) 23 ->get(); 24 25 if (!($db[0]["order"] == $value["new_order"])) { 26 DB::table("order_number") 27 ->where("order_number.type","=", $value["type"]) 28 ->where("order_number.order", "=", $value["new_order"]) 29 ->update([ 30 "order_number.order" => 0 31 ]); 32 33 DB::table("order_number") 34 ->where("order_number.type","=", $value["type"]) 35 ->where("order_number.order", "=", $value["old_order"]) 36 ->update([ 37 "order_number.order" => $value["new_order"] 38 ]); 39 40 DB::table("order_number") 41 ->where("order_number.type","=", $value["type"]) 42 ->where("order_number.order", "=", 0) 43 ->update([ 44 "order_number.order" => $value["old_order"] 45 ]); 46 } 47}
補足情報(FW/ツールのバージョンなど)
PHP 7.2.0
Laravel 5.1.46
回答2件
あなたの回答
tips
プレビュー