Php laravel动态关系特性性能和替代方法

Php laravel动态关系特性性能和替代方法,php,laravel,eager-loading,Php,Laravel,Eager Loading,我有一个关于动态关系属性的问题,假设存在用户和地址模型 我想问$user->address会导致N+1个问题,因此,我们可能会使用渴望加载,但当我调用$user->address->get时也会导致N+1个问题,这是一个好的性能吗 另一个问题是,获取特定用户地址列表的更好方法是什么 我只想获得地址数据而不需要用户数据,因此,我不想使用“即时加载”。如果您只需要没有用户数据的用户地址列表,只需执行以下操作: Address::where('user_id', $user->id)->g

我有一个关于动态关系属性的问题,假设存在用户和地址模型

我想问$user->address会导致N+1个问题,因此,我们可能会使用渴望加载,但当我调用$user->address->get时也会导致N+1个问题,这是一个好的性能吗

另一个问题是,获取特定用户地址列表的更好方法是什么


我只想获得地址数据而不需要用户数据,因此,我不想使用“即时加载”。

如果您只需要没有用户数据的用户地址列表,只需执行以下操作:

Address::where('user_id', $user->id)->get();

您可以在不获取用户数据的情况下获取地址,但仍然需要用户id

这里有一个例子,不管关系类型如何

$userId = 1;
$adresses = Address::whereHas('user', function($user) use ($userId) {
    $user->where('id', '=', $userId);
})->get();

如果已知关系为一对多:使用

我发现我的答案是

User::with('address')->find($id)->address 

我认为获取用户的地址列表是一个更好的答案。

当您已经在$user中获取了用户数据时,您所说的仅获取地址数据而不获取用户数据是什么意思。这是因为如果我使用渴望加载,我将获取用户数据和地址数据。因此,我想知道如何只获取像$user->address->get这样的地址。但是$user->address->get会在地址数量增加时运行许多查询。如果您想在没有用户的情况下获取地址,那么您必须在控制器中加载地址,而不是加载用户。因此,您可以在存储库中创建一个单独的函数。但对于真正的解决方案,我们需要看到更多的代码……然后您应该编写一个简单的查询,使用user_id获取地址。那么,使用hasMany relationship创建动态关系属性的目的是什么呢?@yuk更清楚地解释了这一点。你所说的动态关系属性是什么意思。你在问$user->address和$user->address->get之间有什么区别吗?$user->address和user::with'address'->find$id->address之间没有区别,只是在第二个例子中,你丢失了你查询的用户对象,这意味着性能。由于负载过急,这台机器的性能比以前好得多。它可以处理n+1个问题。如果你追求的是性能,那么就采用@MAY solution或mine,它们都只运行一个查询。您的解决方案运行两个查询,一个用于用户,另一个用于地址
User::with('address')->find($id)->address