我试图优化我的API,在一些有关系的模型上应用急切加载。
例如,我有很多带有$appends
属性的模型和很多getXXXAttribute()
方法来检索相关数据。(我想)要达到那个。我害怕在某个地方产生一个循环(例如,当获取具有地址的用户,并且每个地址检索其用户时,但是用户检索它的地址,每个地址检索他的用户和每个用户[...]),所以我添加了即时加载来改善这一点并防止错误。
但是,我面临着一个问题,我找不到解决方案。我有一个addresses表,它与任何其他模型都没有直接关系。每个模型(例如,Client 和 User)都有一个表(client_addresses和user_addresses),它只包含 address_id 和 _id 列。
解释:
addresses
- id
- address
- complement
- number
- postal_code
- city
- state
user_addresses
- id
- user_id
- address_id
client_addresses
- id
- client_id
- address_id
为了检索User的地址,我在模型中执行以下查询:
protected $appends = ["addresses"];
public function getAddressesAttribute()
{
return Address::select("addresses.*")
->join("user_addresses", "user_addresses.address_id", "=", "addresses.id")
->join("users", "user_addresses.boat_id", "=", "users.id")
->where("users.id", $this->id)
->get();
}
如何将这个有两个连接的复杂查询转换为即时加载?查看Laravel Eloquent文档,我检查了一些“somethingThrough”函数,但我不知道如何使用它们。
谢谢!
1条答案
按热度按时间li9yvcax1#
在您的情况下,可以使用belongsToManyhttps://laravel.com/docs/10.x/eloquent-relationships#many-to-many-table-structure
在用户模型中:
然后,您可以应用即时加载,例如: