@Al3xanderG
Вспоминаю как это быть web разработчиком...

Деревья в Laravel, как создать массив?

Глобальная задача вывести древовидный список файлов.
Есть таблица с файлами file_contracts (id,contract_id,name,parent_id);
Есть таблица с договорами contracts (id,name,date,executor)

Настроил связь в модели contract:
// список файлов к договору
    public function files()
    {
        return $this->hasMany('App\FileContract');
    }


В контроллере получаю элемент contracts
public function show($id)
    {
        $contract=Contract::find($id);
// тут мне надо превратить $contract->files в массив, которые описан ниже
$files = array();

         return view('contract.view')->with('contract',$contract)->with('files',$files);


Мне нужно получить массив, вида:
$documents[0]=array(
            'name'  => 'File 1',
            'id'    => '2',
            'child' => array(
                    '1' => array (
                        'name' => 'sub File 1',
                        'id' => '5',
                        'child' => array (
                                '1' => array (
                                    'name' => 'sub sub file 1',
                                    'id' => '12',
                                ),
                                '2' => array (
                                    'name' => 'sub sub file 2',
                                    'id' => '1342',
                                )
                        )
                    ),
                '2' => array (
                    'name' => 'sub file 2',
                    'id' => '5',
                    'child' => array (
                        '1' => array (
                            'name' => 'sub sub file 1',
                            'id' => '12',
                        ),
                        '2' => array (
                            'name' => 'sub sub file 2',
                            'id' => '1342',
                        )
                    )
                )
            )
        );


Не могу понять как в структуре Laravel мне в действии контроллера сделать функцию с рекурсией, для получения данного массива, либо же вообще это нужно делать где-то в другом месте ?
  • Вопрос задан
  • 668 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Al3xanderG Автор вопроса
Вспоминаю как это быть web разработчиком...
В итоге пока решил задачу следующим образом, добавил новый метод в модели Contract, которому скармливаю массив полученный с помощью связи таблиц:
public function makeContractFiles($array,$level) {
        if(count($array)>0) {
            foreach($array as $key => $value) {
                // выполняем перебор массива и ищем все элементы уровня level
                if($value['parent_id']==$level) {
                    // начинаем собирать новый массив
                    $files[]=array(
                        'name'  => $value['title'],
                        'id'    => $value['id'],
                        'child' => $this->makeContractFiles($array,$value['id']),
                    );
                }
            }
        }

        if(isset($files)) {
            return $files;
        } else {
            return 0;
        }
    }


Данный метод выдает мне массив, который уже спокойно обрабатывается в шаблоне блейда и выдает либо дерево списками UL, либо SELECT выбора.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы