За последние 24 часа нас посетили 22415 программистов и 1153 робота. Сейчас ищут 636 программистов ...

Навигационное меню Laravel 5.4

Тема в разделе "Laravel", создана пользователем zagday, 26 июн 2017.

Метки:
  1. zagday

    zagday Новичок

    С нами с:
    6 май 2017
    Сообщения:
    7
    Симпатии:
    0
    Уважаемые разработчики! Подскажите, как средствами 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 новичок, буду благодарен за любую помощь!
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Надо конечно.
    Покажи код. Должно было выйти, по идее. Не пробовал, правда.
     
  3. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
  4. zagday

    zagday Новичок

    С нами с:
    6 май 2017
    Сообщения:
    7
    Симпатии:
    0
    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Database\Eloquent\Model;
    6.  
    7. class Catalogs extends Model
    8. {
    9.     protected $table = 'catalogs';
    10.  
    11.     public function childrens() {
    12.         return $this->hasMany('Catalogs','parent');
    13.     }
    14.  
    15.     public function parent_my() {
    16.         return $this->belongsTo('Catalogs');
    17.     }
    18. }

    В контроллере:

    PHP:
    1.  public function catalog_page()
    2.     {
    3.         $parent = Catalogs::where('id','=',4)->first()->parent_my;
    4.         $childrens = Catalogs::where('id','=',3)->first()->childrens;
    5.         return view('pages.catalog_page',[
    6.             'menu'=>Menu::all(),
    7.             'parent' => $parent,
    8.             'childrens' => $childrens,
    9.                 ]);
    10.     }
     
  5. zagday

    zagday Новичок

    С нами с:
    6 май 2017
    Сообщения:
    7
    Симпатии:
    0
    Вот как работает (id прописаны из моей БД для тестирования) :
    Модель:
    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Database\Eloquent\Model;
    6.  
    7. class Catalogs extends Model
    8. {
    9.     protected $table = 'catalogs';
    10.  
    11.     public function get_childrens() {
    12.         return $this->hasMany('App\Catalogs','parent');
    13.     }
    14.  
    15.     public function get_parent() {
    16.         return $this->belongsTo('App\Catalogs','parent');
    17.     }
    18. }
    Контроллер:
    PHP:
    1. public function catalog_page()
    2.     {
    3.         $childrens = Catalogs::find(3)->get_childrens;
    4.         $parent = Catalogs::find(4)->get_parent;
    5.         return view('pages.catalog_page',[
    6.             'menu'=>Menu::all(),
    7.             'childrens' => $childrens,
    8.             'parent' => $parent,
    9.                 ]);
    10.     }
    Вьюха:

    @foreach ($childrens as $children)
    {{$children->title}}
    @endforeach

    {{$parent->title}}
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Так, и какие запросы это всё генерирует? https://github.com/barryvdh/laravel-debugbar - вот эта штучка показывает, надо посмотреть, что неправильного. Или какие ошибки.

    Хотя я бы да, воспользовался рекомендацией @romach и перешёл на Nested Sets. Это быстрее будет работать, чем вложенные запросы.
     
  7. zagday

    zagday Новичок

    С нами с:
    6 май 2017
    Сообщения:
    7
    Симпатии:
    0
    @mkramer , @romach спасибо за ответы! Сделал меню, как я описал выше. Скилл пока что не позволяет разобраться с nested sets, но все равно спасибо за расширение кругозора.