如何在Laravel中定义关系并获取所有带有关系的记录?

时间:2019-01-27 23:06:29

标签: php jquery laravel collections eloquent

我想定义表之间的关系,但我不知道我要去哪里。

这些是我的桌子:

用户

    -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()

我该怎么办?

4 个答案:

答案 0 :(得分:1)

在构建器实例的 query 范围内,您定义的

关联不适用于您尝试调用它们的方式。它们在您的模型上下文中可用。在查询中包括您的关系的方式有所不同-您应检查official documentation on the matter first

对于您而言,如果要选择属于特定餐厅的所有菜单,则必须采用以下方式:

  1. 您可以先获取特定餐厅,然后通过关系获取菜单:

    $restaurant = Restaurant::find(2);
    $menus = $restaurant->menus;
    
  2. 您可以通过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');
}