Ajax to PHP: как лучше разобрать для postgreSQL ГДЕ с CASE-запросом - PullRequest
0 голосов
/ 26 сентября 2018

Итак, у меня есть такой сценарий: мне нужно запросить некоторые действия с номерами версий.Некоторые из них имеют только одну версию, другие имеют несколько.Все они происходят из формы, которая уже использует jQuery для добавления новых элементов формы и получения их значений.PHP Ajax уже работает.

Я думал о построении запроса вокруг переменной $case php, вроде как:

$query = "SELECT DISTINCT activity_number, version_number, person_id, conclusion_date
FROM table1
WHERE fixed_parameter
$case
";

Сначала я боролся с "Мне нужно сделатьпеременная case, как =, когда запрашивается одна версия, но мне нужно IN, когда есть несколько. После этого мне пришло в голову, что я могу использовать IN для обоих.

Но теперь я нене знаю, стоит ли мне пытаться обрабатывать случаи с несколькими версиями на стороне javascript или на стороне PHP, и это будет проще / лучше.

В настоящее время я отправляю все, поэтому получаю что-то вроде этогокак данные формы, передаваемые в PHP:

ativities: [{"activity_number":"12044","version_number":"4"},{"activity_number":"12044","version_number":"7"},{"activity_number":"41796","version_number":"0"}]

Если это будет отправлено в PHP, я получу:

AND CASE activity_number
WHEN 12044 THEN version_number IN (4)
WHEN 12044 THEN version_number IN (7)
WHEN 41796 THEN version_number IN (0)
END

, и это, очевидно, не сработает.мне нужно объединить их по Activity_number, чтобы получить что-то вроде {"activity_number":"12044","version_number":"4,7"}. Я покопался, нашел пару странных сценариев, но они были слишком нестандартными, чтобы их ответы не помещались здесь.У меня был этот ответ Javascript - Уменьшить массив с помощью объектов с несколькими ключами , но на самом деле я не понял его логику, поэтому мне очень трудно адаптировать его к моим потребностям.

1 Ответ

0 голосов
/ 26 сентября 2018

Благодаря указателю Алона Эйтана я думаю, что мне удалось найти способ.Мне потребовалось некоторое время, чтобы охватить все сценарии, учитывая один элемент или массив номеров версий, но вот что сработало:

foreach ($activities as $line) {
    $activity_number = $line->activity_number;
    $version_number = $line->version_number;
    if (!isset($out[$activity_number])):
        if (!empty($out)):
            $out[$activity_number] = $line->version_number;
        else:
            $out[$activity_number] = (array)$line->version_number;
        endif;
    elseif (isset($out[$activity_number])):
        if (is_array($out[$activity_number])):
            if (!in_array($version_number,$out[$activity_number])):
                array_push($out[$activity_number],$version_number);
            endif;
        else:
            if ($out[$activity_number] != $version_number):
                array_push($out[$activity_number],$version_number);
            endif;
        endif;
    endif;
}

foreach ($out as $key => $case){
    $caseAtividades .= "WHEN ".$key." THEN nu_versao IN (".implode(',',$case).")
    ";
}

Таким образом, даже если действие повторяется не по порядку, их номер версии будетпо-прежнему проверяться на то, что вы уже там, а если нет, то включайтесь!

...