Правильное возвращение через связанные сущности - PullRequest
4 голосов
/ 20 октября 2011

У меня есть набор организаций и членов их правления.Во всех организациях есть члены правления, и многие члены правления входят в состав правления нескольких организаций.

Я использую JIT Hypertree , чтобы проиллюстрировать их взаимоотношения.Схема JIT Hypertree требует, чтобы один элемент был родительским для всех, и рисуется на основе одного массива JSON.

Я хотел бы запросить повторное центрирование события и повторно заполнить график на основе изменений,Тогда 2 уровня были бы хорошими, но я не смог разобраться, как это сделать.

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

Таким образом, он будет начинаться с Org и добавит массив дочерних элементов Org (членов правления).Затем извлеките все доски (кроме текущей организации) для каждого члена правления и добавьте их в качестве дочерних элементов члена правления.

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

У кого-нибудь есть совет, как создать этот массив и избежать дубликатов?

$board = $center->board();

$top['id'] = $center->ID;
$top['name'] = $center->Org;
$top['children'] = array();
if ($board) {
    foreach ($board as $b) {
        $child['id'] = $b->ID;
        $child['name'] = (strlen(trim($b->Last)) > 0) ? $b->First . ' ' . $b->Last : 'Unknown';
        $child['data']['orgname'] = $center->Org;
        $child['data']['relation'] = $b->Role;
        $child['data']['occupation'] = $b->Occupation;
        $child['children'] = array();
        $childboards = $b->boards();
        if ($childboards) { foreach ($childboards as $cb) { 
            $gchild['id'] = $cb->ID;
            $gchild['name'] = $cb->Org;
            $gchild['data']['orgname'] = (strlen(trim($b->Last)) > 0) ? $b->First . ' ' . $b->Last : 'Unknown';
            $gchild['children'] = array();
            $childboardmembers = $cb->board();
            if ($childboardmembers) { foreach ($childboardmembers as $cbm) {
                $ggchild['id'] = $cbm->ID;
                $ggchild['name'] = (strlen(trim($cbm->Last)) > 0) ? $cbm->First . ' ' . $cbm->Last : 'Unknown';
                $ggchild['data']['orgname'] = $cb->Org;
                $ggchild['data']['relation'] = $cbm->Role;
                $ggchild['data']['occupation'] = $cbm->Occupation;
                $ggchild['children'] = array();
                $gchild['children'][]= $ggchild;
            }}
            $child['children'][]= $gchild;
        }}
        $top['children'][] = $child;
    }
} 
$top['data'] = array();
$top['data']['description'] = $center->Desc;
echo json_encode($top);

// Редактировать 2011.10.24 В ответ на запрос Моя структура данных - это таблица организаций суникальные идентификаторы, таблица людей с уникальными идентификаторами, а затем таблица мостов для двух указанных организации (сущность) и персона и роль, которую человек играет в сущности.Типичное много ко многим.Никаких дополнительных плат вообще.Я сделал его изображение, которое сейчас кажется бессмысленным, но я добавлю его внизу.

Структура данных библиотеки JIT немного сумасшедшая (для меня) в том смысле, что в их группе она выглядит такпример:

Top: Nine Inch Nails
  Child: Jerome Dillon
    Child:  Howlin Maggie (another band)
      {all the bands' members and then all of their bands...}

Таким образом, организация (группа) рассматривается как личность, даже если она состоит из нескольких персон.И когда я повторяю с помощью приведенного выше кода, я получаю (я думаю) ужасное раздувание, но JSON, который он делает, работает правильно, несмотря на раздувание.

Пример JSON и Пример визуализации // Конец редактирования

schema

Ответы [ 3 ]

2 голосов
/ 26 октября 2011

В вашей модели данных «многие ко многим» имеется график . JIT предназначен для деревьев .

Другими словами, JIT не будет правильно показывать линии пересечения, представленные в данных, когда один человек подключен к нескольким организациям.

Я бы порекомендовал правильную визуализацию сетевого графика - D3.js имеет отличную реализацию для современных браузеров.

Формат данных JSON, который он использует, на самом деле проще реализовать с учетом структуры вашей таблицы - для всех организаций и людей вы определяете объекты:

{
    "name": "Mme.Hucheloup",
    "group": 1
},
{
    "name": "Afton School Board",
    "group": 2
}

И для каждой ассоциации в вашей таблице ассоциаций вы определяете объекты соединения, которые связывают их вместе:

{
    "source": 1,
    "target": 2
},

Необычное кодирование в D3 позаботится обо всем остальном. Удачи!

2 голосов
/ 28 октября 2011

Вы можете использовать функцию ниже:

function get_orgs_and_childs ($child_id, $found = array()) 
{
    array_push ($found, $child['name']);

    if($child['children'])){
            $found[] = get_parents($child['id'], $found);
    }
    return $found;
}

Позвоните, используя:

$orgs = get_orgs_and_childs($child['id']);
2 голосов
/ 24 октября 2011

На ваш вопрос сложно ответить в том смысле, что ваша структура данных в основном неизвестна.

Для графического представления вам нужно предоставить простые отношения, только если я правильно понимаю:

*- Parent
   +- Child
   +- Child
   ...
   `- Child

Ваша структура данных имеет другой формат, я не знаю конкретно, но это что-то вроде:

Org <-- 1:n --> Board

Board <-- n:n --> Board # If you have sub-boards

Board <-- n:n --> Member

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

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

if (request_parent_is_org())
{
    $id = request_parent_id();
    $parent = data_get_board($id);
    $parent->addChildrent(data_get_board_children($id));
}
else
{
    ... # All the other decisions you need to take based on request type
}

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