Sql 如何使用laravel eloquent在pivot表上执行额外的内部联接

Sql 如何使用laravel eloquent在pivot表上执行额外的内部联接,sql,inner-join,laravel,pivot-table,eloquent,Sql,Inner Join,Laravel,Pivot Table,Eloquent,我有四张桌子: 食物:身份证,姓名 用户:id,name 测量类型:id、名称 食品用户:id、食品id、用户id、测量类型id 食品和使用者之间存在多对多关系 mealtype与食物使用者有一对一的关系 最后,我希望有一个具有以下属性的模型实例: food.name、users.name、mealtype.name 普通sql应该是: SELECT f.name, u.name, m.name FROM foods f INNER JOIN food_user fu ON f.id = f

我有四张桌子:

  • 食物:身份证,姓名
  • 用户:id,name
  • 测量类型:id、名称
  • 食品用户:id、食品id、用户id、测量类型id
食品和使用者之间存在多对多关系 mealtype与食物使用者有一对一的关系

最后,我希望有一个具有以下属性的模型实例: food.name、users.name、mealtype.name

普通sql应该是:

SELECT f.name, u.name, m.name FROM foods f
INNER JOIN food_user fu ON f.id = fu.food_id
INNER JOIN users u ON fu.id = u.id 
INNER JOIN mealtypes m ON fu.mealtype_id = m.id

谢谢你的帮助

假设您有一个名为Food的模型,您可以使用Elount和Query Builder执行类似操作:

$foods = Food::join('food_user', 'foods.id', '=', 'food_user.food_id')
             ->join('users', 'food_user.user_id', '=', 'users.id')
             ->join('mealtypes', 'food_user. mealtype_id', '=', 'mealtypes.id')
             ->get();

关于查询生成器也有很好的文档:

一年后回答我自己的问题。实际上我问错了问题。数据透视表只是两个表之间的多对多关系。如果表示此多对多关系的表另外与其他表相关,则它不是透视表。因此,在我的例子中,餐桌上的食物使用者应该用定义好的三种关系来代表一个有说服力的实体

更新,通用解决方案:

我不能以雄辩的方式给你我的最终解决方案,因为我已经很久没有使用它了(也没有在那里实现它),所以我不再有这些知识了。更一般地说,需要创建4个模型:

  • 食物
  • 使用者
  • 米型
  • 餐(而不是FoodUser,不喜欢这个名字)
  • 现在,在模型餐中,您需要定义与其他模型的关系:

  • 食物与食物有多对一的关系
  • 用户与用户之间存在多对一关系
  • mealType与mealType有多对一的关系
  • 其他一些属性,如fine.carries(int)和fine.date(DateTime)

  • 感谢您的回复,但是,出于某种原因,返回的对象正确地显示了用户的名称,但只显示了mealtype_id,而没有显示其名称,原因可能是什么?我现在知道,当两个表具有相同的列名时,会发生这种情况。在连接之前,您可以执行以下操作:Food::select('users.name as user_name'、'foods.name as food_name'、'mealtypes.name as mealtype_name')->joins()…我也有同样的情况。你能告诉我你对这个问题的最终解决方案吗?嗨@AmirMojiry,我更新了我的答案,希望对你有帮助。