Laravel Eloquent group by 与数据透视表和关系

Posted

技术标签:

【中文标题】Laravel Eloquent group by 与数据透视表和关系【英文标题】:Laravel Eloquent group by with pivot table & relations 【发布时间】:2016-04-18 08:29:58 【问题描述】:

我正在为食品卡车活动创建这个平台。有许多参展商参加了几个活动。每辆餐车都有自己的菜品菜单,分几类。

问题/我想要实现的目标

我想为每个事件制作一个菜单,循环遍历所有事件 参展商(参加者),然后按类别展示菜肴。

类似的东西;

/menu/eventid

菜品类别 1

参展商A的菜 参展商 B 的菜

菜肴类别 2

exh A 中的菜 C 出品的菜 exh D 中的菜

...

模型

事件模型

class Event extends Model

    protected $table = "events";

    public function exhibitors()
    
        return $this->belongsToMany('App\Exhibitor', 'events_exhibitors');
    

碟型

class Dish extends Model

    //

    protected $table = "dishes";    


    public function category()
    
        return $this->hasOne('App\Category', 'id', 'category_id');
    

    public function exhibitor()
    
        return $this->belongsTo('App\Exhibitor');
    

参展型号

class Exhibitor extends Model

    protected $table = "exhibitors";

    public function events()
    
        return $this->belongsToMany('App\Event', 'events_exhibitors');
    

    public function dishes()
    
        return $this->hasMany('App\Dish');
    

数据库结构

有一个数据透视表来记录哪些食品卡车去哪些活动。到目前为止,我认为(希望)我的关系正常。我希望这张图片足够显示;

我的尝试

我已经尝试了几件事,但我认为我对 Laravel eloquent 的洞察力缺乏理解这个问题背后的逻辑。

$dishes = Event::where('id', $id)
            ->with(['exhibitors.dishes' => function($q) 
            $q->select('dishes.dish_data');
        ])->get();

或者

$dishes = Event::with(array('exhibitor.dish') => function($query) use ($sub)
            $query->where('name',$sub);))->get();

我完全不知道如何通过 Eloquent 完成此操作,也不知道这将如何在视图中工作。

【问题讨论】:

【参考方案1】:

试试这样的:

它将获取与该活动相关的所有参展商的ID。 然后它将获取所有类别,其中连接的菜肴具有在参展商 ID 数组中的 existor_id。

类别模型

class Category extends Model

    protected $table = "categories";    


    public function dishes()
    
        return $this->hasMany('App\Dish', 'category_id');
    

控制器动作

$event = Event::findOrFail($id);

$exhibitorIds = $event->exhibitors()->select('exhibitors.id')->get()->pluck('id')->all();

$categories = Category::whereHas('dishes', function($query) use ($exhibitorIds) 
    $query->whereIn('exhibitor_id', $exhibitorIds);
)->with(['dishes' => function($query) use ($exhibitorIds) 
    $query->whereIn('exhibitor_id', $exhibitorIds);
])->get();

return view('events.menu', compact('event', 'categories') );

查看

@foreach($categories as $category)
<h2> $category->name </h2>
<ul>
   @foreach($category->dishes as $dish)
       <li> $dish->dish_data </li>
   @endforeach
</ul>
@endforeach

【讨论】:

感谢您的帮助。这会在“$categories...”处引发构建器错误“explode() 期望参数 2 是字符串,对象给定” 好的,Laravel 集合所在的参展商,现在使用 ->all() 它返回一个数组。并且秒查询没有使用exportorids 仍然抛出相同的错误...“explode() 期望参数 2 是字符串,给定对象”。当我 dd($exhibitorIds) 它确实是一个包含 id 的数组。 试试不带 ->with(...) 现在再试一次,在with语句中,函数应该是value,关系字符串是key。

以上是关于Laravel Eloquent group by 与数据透视表和关系的主要内容,如果未能解决你的问题,请参考以下文章

通过laravel eloquent查询Mysql sum group

Laravel eloquent order by custom 属性

laravel eloquent order by specific value with PostgreSQL 数据库

Laravel:使用 Query Builder 或 Eloquent ORM 时在每次插入/更新时执行一些任务

Laravel Eloquent 特定列错误

如何在 Laravel 中禁用 only_full_group_by 选项