【问题标题】:how to perform additional inner join on pivot table with laravel eloquent如何使用 laravel eloquent 在数据透视表上执行额外的内部连接
【发布时间】:2013-05-09 06:47:41
【问题描述】:

我有四张桌子:

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

foods 和 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

感谢您的帮助!

【问题讨论】:

    标签: sql inner-join laravel pivot-table eloquent


    【解决方案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)

    【讨论】:

    • 我也有同样的情况。你能告诉我你对这个问题的最终解决方案是什么吗?
    • 嗨@AmirMojiry,我更新了我的答案,希望它对你有帮助。
    【解决方案2】:

    假设你有一个名为 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

    【讨论】:

    • 感谢回复,但是,由于某种原因,返回的对象显示的用户名是正确的,但只有 mealtype_id 而不是它的名称,可能是什么原因?
    • 我现在知道当两个表具有相同的列名时会发生这种情况。
    • 在加入之前,您可以执行以下操作: Food::select('users.name as user_name', 'foods.name as food_name', 'mealtypes.name as mealtype_name')->joins ()...
    猜你喜欢
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多