Уважаемые разработчики! Подскажите, как средствами laravel 5.4 сделать связь один-ко-многим в ОДНОЙ таблице. Хочу вывести меню с неограниченной вложенностью. Есть таблица catalogs ('id','title','parent'),где parent - id родителя В документации читал про hasMany с двумя таблицами, пытался так же сделать с одной - не вышло.Понравилось решение по этой ссылке: https://www.sitepoint.com/laravel-blade-recursive-partials/ но не знаю как данные привести в данную структуру, чтобы был массив по полю childrens, например. Возможно тут есть решение, как на C# entity framework code first, там я указывал тип данных просто и фреймворк автоматически создавал связь. Еще вопрос, если кто знает: а если я руками в phpmyadmin сделаю связь один-ко-многим, в laravel уже не надо прописывать hasMany? В laravel новичок, буду благодарен за любую помощь!
PHP: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Catalogs extends Model { protected $table = 'catalogs'; public function childrens() { return $this->hasMany('Catalogs','parent'); } public function parent_my() { return $this->belongsTo('Catalogs'); } } В контроллере: PHP: public function catalog_page() { $parent = Catalogs::where('id','=',4)->first()->parent_my; $childrens = Catalogs::where('id','=',3)->first()->childrens; return view('pages.catalog_page',[ 'menu'=>Menu::all(), 'parent' => $parent, 'childrens' => $childrens, ]); }
Вот как работает (id прописаны из моей БД для тестирования) : Модель: PHP: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Catalogs extends Model { protected $table = 'catalogs'; public function get_childrens() { return $this->hasMany('App\Catalogs','parent'); } public function get_parent() { return $this->belongsTo('App\Catalogs','parent'); } } Контроллер: PHP: public function catalog_page() { $childrens = Catalogs::find(3)->get_childrens; $parent = Catalogs::find(4)->get_parent; return view('pages.catalog_page',[ 'menu'=>Menu::all(), 'childrens' => $childrens, 'parent' => $parent, ]); } Вьюха: @foreach ($childrens as $children) {{$children->title}} @endforeach {{$parent->title}}
Так, и какие запросы это всё генерирует? https://github.com/barryvdh/laravel-debugbar - вот эта штучка показывает, надо посмотреть, что неправильного. Или какие ошибки. Хотя я бы да, воспользовался рекомендацией @romach и перешёл на Nested Sets. Это быстрее будет работать, чем вложенные запросы.
@mkramer , @romach спасибо за ответы! Сделал меню, как я описал выше. Скилл пока что не позволяет разобраться с nested sets, но все равно спасибо за расширение кругозора.