Генерация иерархии из множества отношений - PullRequest
0 голосов
/ 15 февраля 2019

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

В настоящий момент существует взаимосвязь "многие ко многим" между двумя моделями: Tag s и Nodes.

Теперь мне нужно установить parent_id на модели Tag, чтобы узнать, какой Tag является ее родителем.Это будет рекурсивно, потому что есть несколько уровней глубины.

Дело в том, что этот процесс должен быть разработан из фактических данных о множестве взаимосвязей.Поэтому я играл с коллекциями (Node::all() / Tag::all()), чтобы попытаться создать эту структуру, а затем массово назначить идентификаторы родительского тега в дочерних тегах.

Моя идея заключается в том,чтобы загрузить теги из Node s, а затем создать новый элемент в коллекции для каждого дочернего тега узла

, так что:

|
|__Node A
|  |__Tag 1
|  |__Tag 2
|  |__Tag 3
|
|__Node B
|  |__Tag 1
|  |__Tag 3
|  
|__Node c
   |__Tag 1
   |__Tag 2

Может быть преобразовано в это (я знаю, что каждый элемент должен иметь уникальный ключ, я думал назначить один временный):

|
|__Node A
|  |__Tag 1
|
|__Node A
|  |__Tag 2
|
|__Node A
|  |__Tag 3
|
|__Node B
|  |__Tag 1
|
|__Node B
|  |__Tag 3
|  
|__Node c
|  |__Tag 1
|  
|__Node c
   |__Tag 2

Тогда я мог бы сгруппировать (рекурсивно) ключ тега, получив следующий вид:

|__Tag 1
   |
   |__Tag 2
   |  |
   |  |__Node A
   |  |__Node C
   |
   |__Tag 3
      |
      |__Node A
      |__Node B

Моя проблема в том, что вы не знаете (пока), как правильно выполнить это преобразование.

1 Ответ

0 голосов
/ 21 февраля 2019

Используйте лучшие практики

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

Использовать Eloquent

, а также использовать красноречивые отношения Laravel в качестве активной записи

//in Tag Model
public function children()
{
    return $this->hasMany('App\Models\Tag', 'parent_id');   
}

public function parent(){
     return $this->belongsTo('App\Models\Tag', 'parent_id');
}

public function nodes()
{
    return $this->hasMany('App\Models\Node', 'node_id', 'node_id');   
}

тогда вы можете получить результат

//there should be a relation for node also 
Tag::with('parent', 'children.children', 'node')->get();

простой способ php

, но также вот простой способ, я думаю:

foreach ($tags as $key => $value) {
    $tagTree[$value['tag_id']] = $value;
    $tagTree[$value['tag_id']]['child'] = array();
}

foreach ($tagTree as $key => $value) {
    if ($value['parent_id'] == 0) {
        $root[$key] = &$tagTree[$key];
    } else {
        $tagTree[$value['parent_id']]['child'][$key] = &$tagTree[$key];
    }

    //here you can check if is there any node for current tag insert 
    //$tagTree[$value['parent_id']]['node'][] = ...
}
...