【问题标题】:How can i display grouped values in Laravel如何在 Laravel 中显示分组值
【发布时间】:2019-09-24 07:10:54
【问题描述】:

我正在尝试显示按类别分组的餐厅菜单,例如...

  • 午餐
    • 鸡肉和薯条
    • 大米
  • 早餐
    • 咖啡

所以我的数据库中有 3 个表,餐厅、类别和菜单

类别型号

class Category extends Model
{
    protected $fillable = [
        'name'
    ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
    */
    public function menus_type()
    {
        return $this->hasMany('App\Menu','category_id');
    }
}

菜单模型

class Menu extends Model
{
    protected $fillable = [
        'name',
        'price',
        'description',
        'photoPath',
        'restaurant_id',
        'category_id',
    ];

    /**
     * Menu belongs to Restaurant
     */
    public function restaurant()
    {
        return $this->belongsTo('App\Restaurant');
    }

    /**
     * Menu belongs to category type 
     */
    public function category_type()
    {
        return $this->belongsTo('App\Category', 'category_id');
    }

}

餐厅管理员

public function show($slug, RestaurantRepository $repository){
      if(! $restaurant = $repository->get(['slug' => $slug], with(['cuisines','user', 'photos', 'thumbs', 'region', 'ratings.user']))) return abort('404');

      $menus=Menu::with(['category_type'])->where('restaurant_id',$restaurant->id)->get()->groupBy('category_id');

       return view('frontend.restaurant.show', compact('restaurant', 'p','menus'));
}

当我转储时,它看起来还不错。

结果已分组

现在我的问题出在 View 上,当我尝试获取此结果时出现错误。

   @if($menus)
   <ul>
     @foreach($menus as $m)
       <li>
         {{$m->name}}
       </li>
     @endforeach
   </ul>
   @endif

ErrorException (E_ERROR)。

此集合实例上不存在属性 [名称]。

【问题讨论】:

  • 当你循环遍历$menus 时,$m 本身不是一个集合数组吗?
  • 另外,Menu 属性中没有 name
  • groupBy('category_id')laravel.com/docs/5.8/collections#method-toarray之后添加-&gt;toArray()
  • 看看你的目标,当你在视图中循环时可以利用关系的动态属性时,groupBy() 似乎是多余的。

标签: php laravel laravel-5 eloquent


【解决方案1】:

也迭代内部循环。 'groupBy()' 创建另一个以category_id 为键的数组。

@if($menus)
 <ul>
 @foreach($menus as $category_id=>$outer)
  @foreach($outer as $k=>$inner)
   <li>
      {{$category_id}}: {{$inner->name}}
   </li>
   @endforeach
 @endforeach
 </ul>
 @endif

更新您的查询以从类别中获取

$categories = Category::with('menus_type')->get();
return view('frontend.restaurant.show', compact('restaurant', 'p','categories '));

在你看来

@if($categories ?? false)
 <ul>
 @foreach($categories ?? [] as $cat_key=>$category)
  <li>
      {{$category->name}}
  </li>
  <li>
  <ul>
  @foreach($category->menus_type as $menu_key=>$menu)
  <li>
      {{$menu->name}}
  </li> 
  @endforeach
  </ul>
  </li>
 @endforeach
 </ul>
 @endif

【讨论】:

  • 这似乎工作非常感谢,现在列表需要嵌套在一个类别下,如上所示。所以第一个
  • 是Lunch,然后是菜单项
  • &lt;ul&gt; @foreach($menus as $category_id=&gt;$outer) @foreach($outer as $k=&gt;$inner) &lt;li&gt; {{$category_id}} &lt;ul&gt; &lt;li&gt;{{$inner-&gt;name}}&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; @endforeach @endforeach &lt;/ul&gt; @endif
  • @Wells:如果有,您是否有类别模型,请在您的问题中分享?
  • @wels : 请尝试列出您的 CategoryMenu 的一对多关系。
  • 非常感谢,现在我得到的菜单项不属于餐厅,restaurant_id,我应该在这里更改关系吗?
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签