Sql запрос, где таблица связана с самим собой и создать массив, используя php - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть 1 имя таблицы page_live. Теперь я хочу отобразить его, если isMenu = 1. Теперь он подключен к себе с именем parent_Id.

Как пример - у меня есть page_live с именем test_page, и эта строка является родителем строки с именем inside-1. И inside-1 является родителем inside-2.

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

[0]=>{
 'name' => 'test_page'
 [0]=> {
  'name' => 'inside-1'
  [0] => {
    'name' => 'inside-2'
  }
 }
}

Это моя таблица - enter image description here

Модель PageLive

<?php

namespace App\Http\Models;

use Illuminate\Database\Eloquent\Model;

class PageLive extends Model
{
    protected $table = 'page_live';

    protected $fillable = ['name', 'adminId', 'slugName', 'description',
'imageId', 'metaTitle', 'metaDesc', 'metaKeyword', 'pageTypeId', 'parent_id',
'isHome', 'pageDraftId', 'themeLayoutId'];

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

    public function children()
    {
        return $this->hasMany(App\Http\Models\PageLive::class, 'parent_id');
    }
}

Пожалуйста, помогите мне.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

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

public function abc( $ar, $pid = null ) {
        $op = array();
        foreach( $ar as $item ) {
            if( $item['parent_id'] == $pid ) {
                $op[$item['id']] = $item;
                // using recursion
                $children =  $this->abc( $ar, $item['id'] );
                if( $children ) {
                    $op[$item['id']]['children'] = $children;
                }
            }
        }
        return $op;
    }

Используйте функцию как-то так и вызывайте ее где угодно.

Вы получите структуру массива как -

array:1 [▼
  1 => array:5 [▼
    "id" => 1
    "name" => "Test Page"
    "slugName" => "test-page"
    "parent_id" => null
    "children" => array:1 [▼
      3 => array:5 [▼
        "id" => 3
        "name" => "Inside 1"
        "slugName" => "test-page2"
        "parent_id" => "1"
        "children" => array:1 [▼
          4 => array:4 [▼
            "id" => 4
            "name" => "Inside 2"
            "slugName" => "test-page3"
            "parent_id" => "3"
          ]
        ]
      ]
    ]
  ]
]

Надеюсь, это поможет вам.

0 голосов
/ 23 апреля 2020

Вам нужно использовать рекурсивные отношения в вашей модели:

public function childrenPages()
{
    return $this->hasMany(PageLive::class, 'parent_id', 'id');
}

public function allChildrenPages()
{
    return $this->childrenPages()->with('allChildrenPages');
}

Тогда в контроллере:

$page = PageLive::with('allChildrenPages')->first();

$page->allChildrenPages; // collection of recursively loaded children
// each of them having the same collection of children:
$page->allChildrenPages->first()->allChildrenPages; // .. and so on

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

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