4

我有四张桌子:

  • 食物:身份证、姓名
  • 用户:身份证、姓名
  • 膳食类型:身份证,姓名
  • food_user:id,food_id,user_id,mealtype_id

food 和 user 是多对多的关系 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

谢谢你的帮助!

4

2 回答 2

4

假设您有一个名为 Food 的模型,您可以使用 Eloquent 和 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();

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

于 2013-05-14T21:44:15.480 回答
1

一年后回答我自己的问题。我实际上问错了问题。数据透视表只是两个表之间的多对多关系。如果表示这种多对多关系的表还与其他表相关,则它不是数据透视表。所以在我的例子中,表 food_user 应该代表一个具有定义的三个关系的雄辩实体。

更新,通用解决方案:

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

  1. 食物
  2. 用户
  3. 膳食类型
  4. Meal(而不是FoodUser,不喜欢这个名字)

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

  1. Meal.food 与 Food 具有多对一的关系
  2. Meal.user 与 User 具有多对一的关系
  3. Meal.mealType 与 MealType 具有多对一的关系
  4. 其他一些属性,例如 Meal.calories (int) 和 Meal.date (DateTime)
于 2015-06-18T05:04:36.110 回答