Я начал использовать плагин DataTables Table для jQuery и получил некоторые проблемы. Я использую пример кода отсюда .
У меня MySQL table witch выглядит так:
id | имя | father_id
father_id
– значение id
в одной таблице только в разных father_id
. Поэтому, если я хочу знать имя отца, мне нужно искать в той же таблице WHERE id = father_id
. Но какой DataTable он просто отображает содержимое таблицы MySQL так, как есть.
В моем DataTable я хочу показать такие данные:
id | имя | имя отца | father_id
Поэтому, когда DataTable берет данные из таблицы MySQL, но перед созданием таблицы я хочу изменить значение столбца, которое в то время является значением параметра father_id
в той же строке в MySQL. Я хочу также добавить father_name
, ища его с определенным father_id
.
Как указывал PaulF , вам нужно использовать JOIN
или sub-query для извлечения имени отца из той же таблицы.
Я предполагаю, что вы используете ssp.class.php
для обработки ваших данных на стороне сервера на основе упомянутого вами примера.
Класс ssp.class.php
не поддерживает соединения и ssp.class.php
, но существует обходное решение. Хитрость заключается в использовании подзапроса, как показано ниже в определении $table
. Замените table
фактическим именем таблицы в подзапросе.
$table = <<<EOT ( SELECT a.id, a.name, a.father_id, b.name AS father_name FROM table a LEFT JOIN table b ON a.father_id = b.id ) temp EOT; $primaryKey = 'id'; $columns = array( array( 'db' => 'id', 'dt' => 0 ), array( 'db' => 'name', 'dt' => 1 ), array( 'db' => 'father_id', 'dt' => 2 ), array( 'db' => 'father_name', 'dt' => 3 ) ); $sql_details = array( 'user' => '', 'pass' => '', 'db' => '', 'host' => '' ); require( 'ssp.class.php' ); echo json_encode( SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns ) );
Вам также нужно отредактировать ssp.class.php
и заменить все экземпляры FROM `$table`
FROM $table
чтобы удалить обратные ссылки.
Убедитесь, что все имена столбцов уникальны, иначе используйте AS
для назначения псевдонима.
Также существует репозиторий github.com/emran/ssp, который содержит расширенные ssp.class.php
поддерживающие JOIN.
См. JQuery DataTables: Использование WHERE, JOIN и GROUP BY с помощью ssp.class.php для получения дополнительной информации.
Присоединитесь к таблице с собой – вам нужно будет использовать псевдонимы
SELECT a.id, a.name, b.name, b.id FROM table a join table b on (b.father_id=a.id);
Недавно я обнаружил, что использую DataTables и требую более сложного предложения JOIN и WHERE, которое оригинальный ssp.class.php не поддерживал. Поэтому я изменил исходный файл и немного изменил API, чтобы предоставить таблицу, которая дала мне необходимую мне гибкость. Я объединил функциональность «SSP :: simple» и «SSP :: complex» в единую функцию с именем «SSP :: process».
Из-за длины скрипта, я положил его на pastebin.com здесь: ssp.class.php
И быстрый пример того, как я его использую:
private function get_recent_payments() { global $pdoHost, $pdoUser, $pdoPass, $pdoDatabase; // SQL server connection information $sql_details = array( 'user' => $pdoUser, 'pass' => $pdoPass, 'db' => $pdoDatabase, 'host' => $pdoHost ); // DataTables server-side processing require_once('ssp.class.php'); $options = [ 'table' => 'payments', 'alias' => 'l', 'primaryKey' => 'id', 'columns' => [ [ 'db' => 'id', 'dt' => 0 ], [ 'db' => 'client_id', 'dt' => 1, 'join' => [ 'table' => 'clients', 'on' => 'id', 'select' => 'first_name', 'alias' => 'c', 'as' => 'fname', ] ], [ 'db' => 'client_id', 'dt' => 2, 'join' => [ 'table' => 'clients', 'on' => 'id', 'select' => 'last_name', 'alias' => 'c' ] ], [ 'db' => 'pay_date', 'dt' => 3 ] ], 'where' => [ [ 'db' => 'client_id', 'op' => '!=', 'value' => $_SESSION['client_id'] ] ] ]; $this->response(SSP::process($_REQUEST, $sql_details, $options)); }
В параметрах «где» и «whereResult» (SEE «SSP :: complex» для деталей) также может быть «псевдоним», чтобы ссылаться на столбец в объединенной таблице.
Пример SQL-запроса, переданного на сервер:
SELECT l.`id`, c.`first_name` AS 'fname', c.`last_name`, l.`pay_date` FROM `payments` l JOIN `clients` c ON (c.`id` = l.`client_id`) WHERE l.`client_id` != :binding_0 ORDER BY l.`pay_date` DESC LIMIT 0, 5
Я взял маршрут структурированного массива, потому что это позволило мне создавать запросы, сохраняя при этом жесткость запросов с backticks и связанными параметрами оператора. Я поднимаю этот пост в надежде, что другие найдут его полезным, как я.