如何在使用Laravel Eloquent的透视表上执行附加内联接?

4

我有四张表:

  • foods:id,name
  • users:id,name
  • mealtypes:id,name
  • food_user:id,food_id,user_id,mealtype_id

foods和users之间有多对多的关系,mealtypes和food_user之间有一对一的关系

最终我想要一个具有以下属性的模型实例: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

感谢您的任何帮助!
2个回答

4

如果你有一个名为“Food”的模型,可以使用Eloquent和查询构建器来完成类似以下操作:

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

关于查询构建器有一份很好的文档:http://www.laravel.com/docs/queries


谢谢回复,然而由于某些原因,返回的对象只显示了用户的名称,但是餐点类型ID和其名称却没有显示出来,可能是什么原因呢? - roelleor
我现在知道,当两个表具有相同的列名时,就会发生这种情况。 - roelleor
在进行连接操作之前,您可以这样做:Food :: select('users.name as user_name','foods.name as food_name','mealtypes.name as mealtype_name')-> joins() ... - Luis Dalmolin

1
我一年后回答自己的问题。实际上,我问错了问题。数据透视表只是两个表之间的多对多关系。如果表示这种多对多关系的表还与其他表相关,则它不是数据透视表。因此,在我的情况下,food_user表应该代表一个独立的Eloquent实体,并定义三个关系。
更新,通用解决方案:
我无法以Eloquent的术语给出最终解决方案,因为我很久没有使用它(并且没有在那里实现它),所以我不再具有相关知识。更一般地说,需要创建4个模型:
1. Food 2. User 3. MealType 4. Meal(而不是FoodUser,我不喜欢那个名字)
现在,在Meal模型中,您需要定义与其他模型的关系:
1. Meal.food与Food具有多对一关系 2. Meal.user与User具有多对一关系 3. Meal.mealType与MealType具有多对一关系 4. 一些其他属性,例如Meal.calories(int)和Meal.date(DateTime)

我有同样的情况。你能告诉我这个问题的最终解决方案吗? - Amir Mojiry
1
嗨@AmirMojiry,我更新了我的答案,希望对你有所帮助。 - roelleor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接