如何在数据透视表上使用laravel eloquent执行额外的内部连接?

问题描述 投票:4回答:2

我有四张表。

  • 食物:ID,名称
  • 用户: id, name
  • 饭菜类型:ID,名称
  • food_user: id, food_id, user_id, mealtype_id。

食物和用户有多对多的关系mealtype与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

谢谢你的帮助!

sql inner-join laravel pivot-table eloquent
2个回答
4
投票

你可以用Eloquent和Query Builder做这样的事情,假设你有一个名为Food的模型。

$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.comdocsqueries


1
投票

一年后回答我自己的问题。其实我问错了问题。数据透视表只是两个表之间的多对多关系。如果一个表代表了这种多对多关系,另外还与其他表有关系,那就不是一个数据透视表。所以在我的案例中,表food_user应该在定义了三种关系的情况下,自己代表一个伶俐的实体。

更新,通用解决方案。

我不能给你我在Eloquent方面的最终解决方案,因为我已经很久没有使用它了(也没有在那里实现它),所以我已经没有这方面的知识了。比较笼统的说,需要创建4个模型。

  1. 食物
  2. 用户
  3. 饭菜类型
  4. 饭菜(代替FoodUser,不喜欢这个名字)

现在,在模型 Meal 中,你需要定义你与其他模型的关系。

  1. Meal.food与Food有多对一的关系。
  2. Meal.user与User有多对一的关系。
  3. Meal.meanType与MealType有多对一的关系。
  4. 一些其他属性,如Meal.calories (int)和Meal.date (DateTime)。
© www.soinside.com 2019 - 2024. All rights reserved.