我想定义表之间的关系,但我不知道我要去哪里。
这些是我的桌子:
用户
-id -email -level
餐厅
-id -name -user_id
菜单
-id -name
restaurant_menu
-restaurant_id -menu_id -price
在users
表中,字段level
由我设置两个词:[user]
或[restaurant]
。
用户模型
public function restaurant(){
return $this->hasOne(Restaurant::class);
}
餐厅模型
public function menus(){
return $this->hasMany(Menu::class);
}
菜单模型
public function restaurants(){
return $this->belongsTo(Restaurant::class);
}
我希望这段代码的输出:
$result = $restaurant->where('id',2)->menus()->get();
成为记录和关系,但出现以下错误。
BadMethodCallException 调用未定义的方法Illuminate \ Database \ Eloquent \ Builder :: menus()
我该怎么办?
答案 0 :(得分:1)
关联不适用于您尝试调用它们的方式。它们在您的模型上下文中可用。在查询中包括您的关系的方式有所不同-您应检查official documentation on the matter first。
对于您而言,如果要选择属于特定餐厅的所有菜单,则必须采用以下方式:
您可以先获取特定餐厅,然后通过关系获取菜单:
$restaurant = Restaurant::find(2);
$menus = $restaurant->menus;
您可以通过Menu
模型查询菜单:
$menus = Menu::whereHas('restaurants', function ($query) {
$query->where('id', 2);
})-get();
您的人际关系也不正确。根据表格结构,您提供的菜单和餐厅之间是多对多关系。因此,restaurants()
类中的Menu
关系方法需要返回BelongsToMany
实例。因此,当您使用它时,我强烈建议您阅读relationships文档并观看示例,直到您了解Laravel中不同关系如何工作的概念。
答案 1 :(得分:0)
实际上,
您以正确的方式定义了关系。我认为,您需要在雄辩的查询中获得这些关系。如果要获取特定餐厅的菜单关系;你必须实现类似的东西。
$restaurant = Restaurants::find(2);
$restaurant->menus(); // this will return an array of related menus.
您应该阅读Laravel Offical documentation。每个关系定义都有检索关系标题。
答案 2 :(得分:0)
您的关系有问题。餐厅模型和菜单模型之间存在一对多关系。但是,您的表结构表明它们具有多对多模型。
如果您认为自己的模型是正确的,则按以下方式更改菜单表,
菜单
-id
-name
-restaurant_id //new field
此外,删除“ restaurant_menu”表。
如果您认为数据库正确,请尝试相应地更改模型。
答案 3 :(得分:0)
用户模型
public function restaurant(){
return $this->hasMany(Restaurant::class,'user_id','id');
}
餐厅模型
public function menus(){
return $this->hasMany(Menu::class,'id','menu_id');
}
菜单模型
public function restaurants(){
return $this->belongsTo(Restaurant::class);
}
在调整输出时,您需要编写
$result = Restaurant::with('menus')->where('id',2)->get();
您将获得关系数据。像哪个餐厅有哪些菜单。
您也可以将其用于您的方案。在您的餐厅模型中使用
public function menues(){
return $this>hasManyThrough(Menu::class,restaurant_menu::class,'menu_id','id','id','restaurant_id');
}