Сократить время для запроса на обновление в Laravel (без цикла for, для того же ключа и нескольких значений) - PullRequest
0 голосов
/ 19 декабря 2018
for ($i = 0; $i < count($ids); $i++) {
    ls_player_details::where('Bib_no', $ids[$i])->update(['chestno' => $chestnos[$i]]);
}

Этот запрос на обновление занимает 8 сек для 162 записей, поэтому хочу сократить время

Итак, я сделал это;

for ($i = 0; $i < count($chestnos); $i++) {
    $data[] = array('chestno' => $chestnos[$i]);
}

ls_player_details::whereIn('Bib_no', $ids)->update($data);

теперь в чем проблема;

теперь я получаю данные вот так

[ 
    {
        "chestno": 50
    },
    {
        "chestno": 51
    },
    {
        "chestno": 52
    },
    {
        "chestno": 53
    },
    {
        "chestno": 54
    },
    {
        "chestno": 55
    },
]

Но я хочу получить массив вроде;

["chestno": 50,"chestno": 50,"chestno": 50]

проблема:

Выдвижение нескольких значений для одного и того же ключа в массив, используя цикл,

И я хочу знать, что естьлюбой другой способ сделать то же самое.

1 Ответ

0 голосов
/ 19 декабря 2018

Как я предложил в комментарии, один из методов - это рефакторинг с использованием предложения CASE WHEN.

Вы должны иметь возможность использовать оператор DB:raw select с вызовом метода update.

$data = '(SELECT CASE Bib_no';
foreach ($ids as $i => $id) {
    if (!array_key_exists($i, $chestnos)) {
        /* uncomment to prevent NULL value when $id is not in $chestnos
        unset($ids[$i]);
        */
        continue;
    }
    $data .= ' WHEN "' . $id . '" THEN "' . $chestnos[$i] . '"';
}
$data .= ' END)';

ls_player_details::whereIn('Bib_no', $ids)
    ->update(['chestno' => DB::raw($data)]);

Пример https://3v4l.org/tglaB

Полученный в результате запрос должен выглядеть следующим образом:

UPDATE ls_player_details
SET chestno = (SELECT CASE Bib_no
WHEN "a" THEN "50"
WHEN "b" THEN "51"
WHEN "c" THEN "52"
WHEN "d" THEN "53"
WHEN "e" THEN "54"
WHEN "f" THEN "55"
WHEN "g" THEN "56"
END)
WHERE Bib_no IN("a", "b", "c", "d", "e", "f", "g")

Это обновит столбец chestno до соответствующей ссылки Bib_no, если она выбрана.Если в предложении CASE WHEN нет совпадений Bib_no, по умолчанию будет NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...