jqGrid JSON с SQL JOIN

#jquery #postgresql #jqgrid

#jquery #postgresql #jqgrid

Вопрос:

У меня возникли трудности с поиском хорошего решения для обработки извлечения данных из SQL (Postgres 8.4) и отображения их в jqGrid. Проблемные таблицы:

  1. meta («основная» таблица)…
      -------------------------------- 
    | id | metaname | metavalue      |
     -------------------------------- 
    |  1 | host     | www.google.com |
    |  2 | ip       | 8.8.8.8        |
     -------------------------------- 
     
  2. metauser (присоединяется к metausedby)…
      --------------- 
    | id | metauser |
     --------------- 
    |  1 | Tool 1   |
    |  2 | Tool 2   |
    |  3 | Tool 3   |
     --------------- 
     
  3. metausedby (реляционная таблица, содержащая только идентификаторы meta и идентификаторы metauser)…
      -------------------------- 
    | id | metaid | metauserid |
     -------------------------- 
    |  1 |      1 |          2 |
    |  2 |      2 |          1 |
    |  3 |      2 |          3 |
     -------------------------- 
     

meta metausedby Как вы можете видеть в , отношение : metausedby один: много . Итак, мой запрос возвращается…

      ------------------------------------------------------------ 
    | id | metaname | metavalue      | metauserid | metausername |
     ------------------------------------------------------------ 
    |  1 | host     | www.google.com |          2 | Tool 2       |
    |  2 | ip       | 8.8.8.8        |          1 | Tool 1       |
    |  2 | ip       | 8.8.8.8        |          3 | Tool 3       |
     ------------------------------------------------------------ 
 

Итак, что я могу / должен сделать, чтобы справиться с созданием поля jqGrid select (multi) для отображения нескольких возможностей metauserid / metausername ? В предыдущих сетках, которые я создавал, данные почти полностью обрабатывались на PHP — вызов функции для запроса, а затем манипулирование JSON для построения select строки jqGrid (при необходимости превращая несколько записей в одну), но мне не понравился этот подход, и я не думаю, что он очень удобен для этой конкретной сетки.

Возможно, мой запрос не идеален, и его можно было бы обработать там, или, может быть, это можно легко обработать в Javascript / jQuery (ни в одном из которых я не очень хорош, поэтому я так сильно полагался на обработку данных PHP ранее).

Цель состоит в том, чтобы создать сетку, похожую на…

      --------------------------------------- 
    | Meta Name | Meta Value      | Used By |
     --------------------------------------- 
    | host      | www.google.com  | Tool 2  |
     --------------------------------------- 
    | ip        | 8.8.8.8         | Tool 1  |
    |           |                 | Tool 2  |
    |           |                 | Tool 3  |
     --------------------------------------- 
 

Пожалуйста, обратите внимание, что в приведенном выше примере инструмент сетки 2 фактически не будет отображаться; при редактировании формы будут отображаться все инструменты, включая инструмент 2, и будут выбраны инструменты 1 и 3 (jqGrid должен сделать это автоматически, если данные настроены правильно)

Used By Поле при редактировании формы должно быть select (мульти) полем, отображающим все «инструменты» из metauser и, в идеале, должно иметь соответствующие инструменты, выбранные при редактировании существующей записи.

Мой текущий запрос…

 WITH paged AS 
    (
        SELECT 
            meta.id as metaid, 
            metaname, 
            metavalue, 
            metauser.id as usedby, 
            ROW_NUMBER() OVER (ORDER BY ' . $orderBy . ') AS rowNumber 
        FROM meta 
        LEFT JOIN metausedby ON metausedby.metaid = meta.id 
        LEFT JOIN metauser ON metauser.id = metausedby.metauserid
    )

SELECT 
    metaid, 
    metaname, 
    metavalue, 
    usedby 
FROM paged 
WHERE rowNumber BETWEEN ' . $start . ' AND ' . $end . ';';
 

Мое usedby поле определяется следующим образом в jqGrid colModel :

     {
        name: 'usedby', 
        index: 'usedby',
        editable: true, 
        editoptions: 
        {
            multiple: true, 
            size: "<?php echo $metaUserCount; ?>", 
            value: "<?php echo $metaUserString; ?>"
        }, 
        edittype: 'select'
    }
 

Конечно, это отображает select поле в форме редактирования (и для данной записи выбирается соответствующий инструмент), но из-за JSON (как показано в примере вывода моего запроса выше) У меня есть две отдельные записи для meta идентификатора 2 … одна для инструмента 1, а другая для инструмента 2.

Следует учитывать фактор, который может повлиять на решение, — это подкачка страниц на стороне сервера, которую я использую с этой сеткой.

Вероятно, все это довольно просто для кого-то, кто лучше разбирается в SQL и jQuery / jqGrid, чем я, поэтому я ценю ваше терпение и помощь. Один последний комментарий, моя сетка работает, за исключением сортировки, как справиться с этим вопросом.

Спасибо.

Ответ №1:

Мое решение состояло в том, чтобы, как только у меня будут локальные данные, выполнить цикл по ним, чтобы изменить данные так, как я хочу, и динамически управлять loadonce и типом данных, чтобы обеспечить всю необходимую функциональность.