gpt4 book ai didi

laravel - 预加载三向数据透视表 Laravel

转载 作者:行者123 更新时间:2023-12-05 05:18:51 28 4
gpt4 key购买 nike

在使用三向数据透视表时,我很难在 Laravel 中进行预加载。数据库设置如下:

+-------+--------+-------+-------------+
| deals | venues | users | redeems |
+-------+--------+-------+-------------+
| id | id | id | deal_id |
| title | name | name | user_id |
| | | | venue_id |
| | | | redeemed_at |
+-------+--------+-------+-------------+

redeems 显然是数据透视表。用户模型如下所示:

<?php

class User extends Authenticatable
{
/**
* The deals redeemed by the user.
*/
public function deals()
{
return $this->belongsToMany(Deal::class, 'redeems')
->withPivot(['venue_id', 'redeemed_at']);
}
}

这允许我这样做:

$users = Users::with('deals')->all();

然后我可以很好地了解用户以及他们在这样的结构中兑换的所有交易:

{
"id": 1,
"name": "Diederik",
"deals": [
{
"id": 33,
"title": "Deal Title",
"pivot": {
"user_id": 1,
"deal_id": 33,
"venue_id": 50
}
}
]
}

现在我想通过预先加载来添加 field 信息,而不是事后查询 $user->pivot->venue_id

我尝试在 deal 模型中设置一个 belongsTo 关系,然后像这样嵌套 with:$users = Users::with('deals .venue')->all(); 但这不起作用,因为交易表没有 field 的外键。这是因为一项交易可以应用于多个场所。

我知道使用普通的数据库查询很容易实现这一点,但是对于我们的 API 的工作方式,必须使用 Eloquent with 关系函数作为我们的 URL 设置查找包括这种方式。

TLDR:如何预先加载嵌套的三向数据透视表关系。

最佳答案

我建议您将数据透视表视为另一种模型(兑换)。然后与其他表/模型(交易/地点/用户)建立一对多关系,这样您就可以像这样使用 Eloquent 进行查询以延迟加载您需要的对象:

$redeems = User::find($id)->redeems;
$redeems->load(['venue','deal']);

return $redeems;

要以精确的方式格式化数据/响应,您可以使用 API Resources如果您使用 5.5。或者 Fractal 5.4 或以下。

关于laravel - 预加载三向数据透视表 Laravel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47162749/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com