php Laravel Eager使用中间关联表加载

5jvtdoz2  于 2023-03-21  发布在  PHP
关注(0)|答案(1)|浏览(128)

我试图优化我的API,在一些有关系的模型上应用急切加载。
例如,我有很多带有$appends属性的模型和很多getXXXAttribute()方法来检索相关数据。(我想)要达到那个。我害怕在某个地方产生一个循环(例如,当获取具有地址的用户,并且每个地址检索其用户时,但是用户检索它的地址,每个地址检索他的用户和每个用户[...]),所以我添加了即时加载来改善这一点并防止错误。
但是,我面临着一个问题,我找不到解决方案。我有一个addresses表,它与任何其他模型都没有直接关系。每个模型(例如,ClientUser)都有一个表(client_addressesuser_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”函数,但我不知道如何使用它们。
谢谢!

li9yvcax

li9yvcax1#

在您的情况下,可以使用belongsToManyhttps://laravel.com/docs/10.x/eloquent-relationships#many-to-many-table-structure
在用户模型中:

public function addresses()
{
    return $this->belongsToMany(Address::class, 'user_addresses');
}

然后,您可以应用即时加载,例如:

User::with('addresses')->first()

相关问题