Показывать описание внешнего ключа вместо значения с помощью AJAX / нескольких операторов SQL в выводе - PullRequest
1 голос
/ 05 мая 2019

В общем, я работаю с 3 различными таблицами (3 уровня), каждая из которых имеет ссылку на предыдущую таблицу с внешним ключом. Таблица второго уровня имеет внешний ключ, который ссылается на предыдущую, а также таблицу третьего уровня, которая ссылается на 2-ую таблицу. В настоящее время я отображаю все эти значения в выпадающих списках. В раскрывающемся списке множественного выбора третьего уровня в настоящее время отображается значение внешнего ключа из раскрывающегося списка множественного выбора второго уровня. Все, что я хочу сделать, это изменить значение внешнего ключа, чтобы отобразить описание, которое находится внутри таблицы 2-го уровня. Вот как это выглядит в настоящее время со значениями внешнего ключа в optgroup: (https://imgur.com/a/4LPnit1)

До сих пор я всегда делал это, создавая другой оператор sql, который выбирает описание на основе идентификатора из таблицы 2-го уровня. Я не уверен, как я могу сделать это, так как в настоящее время у меня есть JavaScript с функцией множественного выбора, который обращается к файлу php через ajax, который включает в себя оператор sql с выходными данными. Для лучшего обзора я приложил важные части кода:

//Javascript
$('#idsecondlevel').multiselect({
        onChange:function(option, checked){
            //Store selected value in array format in selected variable
            var selected = this.$select.val();
            if(selected.length > 0){
                $.ajax({
                    url:"http://localhost:8080/fetch_xx.php",
                    method:"POST",
                    data:{selected:selected},
                    success:function(data){
                        $('#idthirdlevel').html(data);
                        $('#idthirdlevel').multiselect('rebuild');
                    }
                })
            }
        }  
    });
//fetch_xx.php
include 'dbconnect.php';
if(isset($_POST["selected"])){
    $id = join("','", $_POST["selected"]);
    $sql= "SELECT * FROM 3rdlevel WHERE foreign_key_2ndlevel IN ('".$id."')";
    $res=mysqli_query($conn, $sql);
    $output = '';
    foreach($res as $row){
        $output .= '<optgroup label="'.$row["foreign_key_2ndlevel"].'"><option value="'.$row["primary_key_3rdlevel"].'">'.$row["desc_3dlevel"].'</option></optgroup>';
    }
    echo $output;
}

Нужно ли сделать еще один SQL-оператор перед функцией isset и добавить его в вывод, где у меня в данный момент есть $ row ["foreign_key_2ndlevel"]? Или мне нужно сделать еще один SQL-оператор в выводе, который выбирает описание 2-го уровня на основе идентификатора, что сделает его очень грязным? В настоящее время я понятия не имею, где добавить это утверждение. Возможный sql statemtent будет:

$sql= SELECT desc_2ndlevel FROM 2ndlevel WHERE primary_key_2ndlevel = foreign_key_2ndlevel;

1 Ответ

1 голос
/ 05 мая 2019

Просто чтобы убедиться, что я правильно понял: содержимое 2-го и 3-го уровня отображается динамически, основываясь на выбранных значениях из его родительской таблицы. Итак, в основном, вы хотите, чтобы пользователь выбрал что-то / несколько вещей в таблице 2-го уровня, а затем заставил его углубиться в детали на 3-м уровне? На скриншоте вы отметили 1, 2 и т. Д. Вы хотите отобразить описание выбранного идентификатора из родительской таблицы?

Если это так, чтобы избежать другого оператора SELECT, вы можете использовать JOINS. Глядя на ваш код, вы можете использовать INNER JOIN. Чтобы дать вам пример SELECT третьего уровня, проверьте псевдокод ниже. Возможно, вы захотите отобразить историю классификации в виде URL (например, «abc / xyz» в качестве заголовка с опциями 3-го уровня ниже), поэтому вам также понадобится описание первого уровня. Если вы этого не сделаете, просто удалите соответствующие столбцы. Для интеграции с вашим PHP просто сравните с идентификатором выбранной вами опции.

SELECT a.id, a.description, b.id, b.foreign_key_firstlevel, b.description, c.id, c.foreign_key_secondlevel, c.description
    FROM first_level_table AS a
    INNER JOIN second_level_table AS b ON a.id = b.first_level_foreignkey
    INNER JOIN third_level_table AS c ON b.id = c.second_level_foreignkey;

Еще одна вещь, которая приходит на ум: содержание уровня 1 - 3 довольно статично, так почему бы не использовать View? Конечно, это связано с ограничениями, но так как вы, кажется, выбираете только значения, это не должно вас беспокоить. Соединения требуют большого количества вычислений и замедляют ваши вычисления, если они сделаны чрезмерно. Вы можете обойти это, используя подготовленный вид. Поскольку я не знаю структуру вашей базы данных, псевдокод может выглядеть примерно так:

CREATE VIEW view_allselectoptions AS 
    SELECT a.id, a.description, b.id, b.foreign_key_firstlevel, b.description, c.id, c.foreign_key_secondlevel, c.description
        FROM first_level_table AS a, second_level_table AS b, third_level_table AS c
        WHERE a.id = b.foreign_key_firstlevel
            AND b.id = c.foreign_key_secondlevel;

Вы также можете использовать JOINS в представлении. Код будет похож на приведенный выше.

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