7

モデル

 class Menu extends Eloquent {

        public static $table = 'menus';

        public function parent_menu()
        {
            return $this->belongs_to('Menu', 'parent_id');
        }

    }

コントローラーで取得する方法:

$menus = Menu::with('parent_menu')->get();

ビューでレンダリングするにはどうすればよいですか:

foreach($menus as $m)
{
  echo $m->parent_menu->title;
}

リレーションがテーブル内にあるときに問題があるように見えますが、エラーが発生します

`trying to get property of non object`

これに対する解決策はありますか?

4

4 に答える 4

4

Laravel 4 のメニューで無限の深さを得る方法を実装しました。それはまさにあなたが求めるものではありませんが、テクニックは簡単に適応できるはずです。

手始めに、私のメニューはマスター ビューに割り当てられる単なる配列 (今のところ) であり、次のようになります。

$menu = array(
   array(
     'name' => 'item1',
     'url' => '/'
   ),
    array(
     'name' => 'item2',
     'url' => '/',
     'items' => array(
        array(
          'name' => 'subitem1',
          'url' => '/'
        ),
        array(
          'name' => 'subitem2',
          'url' => '/'
        )
     )
   )
);

モデルを使用することで、この構造を簡単に実現できます。child_itemsメニューを下からではなく上から下にレンダリングするため、関数または何かが必要になります。

マスター ブレード テンプレートで、次のようにします。

<ul>
    @foreach ($menu as $item)
       @include('layouts._menuItem', array('item' => $mainNavItem))
    @endforeach
</ul>

そして、layouts._menuItemテンプレートでこれを行います:

<?php
$items = array_key_exists('items', $item) ? $item['items'] : false;
$name = array_key_exists('name', $item) ? $item['name'] : '';
$url = array_key_exists('url', $item) ? url($item['url']) : '#';
$active = array_key_exists('url', $item) ? Request::is($item['url'].'/*') : false;
?>

<li class="@if ($active) active @endif">
       <a href="{{ $url }}">{{ $name }}</a>
       @if ($items)
          <ul>
             @foreach ($items as $item)
               @include('layouts._menuItem', array('item' => $item))
             @endforeach
          </ul>
       @endif
</li>

ご覧のとおり、このテンプレートは自分自身を再帰的に呼び出しますが、別の$item変数を使用しています。これは、メニュー構造を好きなだけ深くすることができることを意味します。(php ブロックはいくつかの変数を準備するためにあるだけなので、実際のテンプレート コードをクリーンで読みやすい状態に保つことができます。技術的には必須ではありません)。

上記のスニペットの Twitter Bootstrap コードを単純化するために削除したため (実際には、テンプレート/配列にタイトル、ドロップダウン トグル、アイコン、仕切りなどがあります)、コードはテストされていません。ただし、フルバージョンは私にとっては問題なく機能しているので、どこかで間違いを犯した場合はお知らせください.

これが途中であなた(または他の誰か、これはかなり古い質問であるため)に役立つことを願っています. さらにポインタ/ヘルプが必要な場合、または私の完全なコードが必要な場合はお知らせください。

ハッピーコーディング!

于 2013-10-05T21:14:49.243 に答える
1

無制限のサブメニューを持つ私のlaravelメニュー(データベースからのメニュー項目)

public function CreateMenu( $parid, $menu, $level ) {

    $output = array();    
    $action= Route::current()->getUri();
    $uri_segments = explode('/', $action);
    $count=count($uri_segments);
    foreach( $menu as $item => $data ) {

            if ($data->parent_id == $parid) { 
                $uri='';
                $output[ $data->id ] = $data;
                for($i=0; $i<=$level; $i++) {
                    if($i < $count) {
                        $uri.="/".Request::segment($i+1);
                    }
                    if($uri == $data->link ) {
                        $output[ $data->id ]->activeClass = 'active';
                        $output[ $data->id ]->inClass = 'in';
                    }
                    else {
                        $output[ $data->id ]->activeClass = '';
                        $output[ $data->id ]->inClass = '';
                    }
                    $output[ $data->id ]->level = $level+2;
                }
                $output[ $data->id ]->submenu = self::CreateMenu( $data->id, $menu, $level+1 );
            }

    }
    return $output;

}

BaseController または必要な場所に配置します

$navitems=DB::table('navigations')->get();
$menu=BaseController::CreateMenu(0,$navitems,0);
return View::share($menu);

その後、メニューのhtmlをmacro.phpに入れます

HTML::macro('MakeNavigation', function($data) {

foreach ($data as $key => $value) {
    if($value->submenu) {
        echo '<li class="'.$value->activeClass.'">
        <a href="'.$value->link.'" class="'.$value->activeClass.'">"'
            .$value->name.' <span class="fa arrow"></span> 
        </a>';
        echo "<ul class='nav nav-".$value->level."-level ".$value->inClass." '>";
            HTML::MakeNavigation($value->submenu);
        echo "</ul>";
    }
    else {
        echo '<li class="'.$value->activeClass.'">
        <a href="'.$value->link.'" class="'.$value->activeClass.'">'
                      .$value->name.'
        </a>';
    }
    echo "</li>";
}});

そして、ビュー(ブレードテンプレート)で呼び出すだけです

{{ HTML::MakeNavigation($menu) }}
于 2014-02-10T18:50:59.830 に答える
0

これは役立つかもしれません。製品カテゴリ/サブカテゴリで行った方法は次のとおりです

モデル:

<?php

class Category extends Eloquent {

    protected $table = 'product_category';

    public function subcat()
    {
        return $this->hasMany('Category', 'node_id')->orderBy('position');
    }

クエリ (熱心な読み込みを使用する場合は条件を使用できます)

$categories = Category::with(['subcat' => function($query){
    $query->with(['subcat' => function($query){
        $query->orderBy('name');
    }])
}])->where('node_id', 0)->orderBy('position')->get(['id', 'name']);

foreach ($categories as $level1)
{
    echo $level1->name;

    foreach ($level1->subcat as $level2)
    {
        echo $level2->name;

        foreach ($level2->subcat as $level3)
        {
                echo $level3->name;
        }
    }
}
于 2013-05-04T23:11:17.333 に答える