Php 使用同一类型的多个关系改进即时加载
我有以下型号:Php 使用同一类型的多个关系改进即时加载,php,laravel,eloquent,laravel-8,eager-loading,Php,Laravel,Eloquent,Laravel 8,Eager Loading,我有以下型号: 类消息扩展模型 { 公共函数发送器():HasOne { 返回$this->hasOne(用户::class,'sender_id','id'); } 公用函数接收器():HasOne { 返回$this->hasOne(User::class,'receiver_id','id'); } } 当我执行Message::with(['sender','receiver'])->all()时,即时加载将执行以下查询: 从消息中选择* 从(1、3、5)中的用户中选择* 从(3、
类消息扩展模型
{
公共函数发送器():HasOne
{
返回$this->hasOne(用户::class,'sender_id','id');
}
公用函数接收器():HasOne
{
返回$this->hasOne(User::class,'receiver_id','id');
}
}
当我执行Message::with(['sender','receiver'])->all()
时,即时加载将执行以下查询:
从消息中选择*
从(1、3、5)中的用户中选择*
从(3、5、7)中的用户中选择*
这几乎是可能的最少冗余的方式。但它仍然会加载用户3和用户5两次。有没有办法通过雄辩而急切的加载来进一步改进这一点?没有,没有
您提供的示例是一个例外,没有任何信息表明任何用户都将出现在发送方和接收方查询中
在这种情况下,你可以编写一些代码来改变雄辩的行为,但这不值得
缺点:
- 案例仅限于加载到同一实体上的两个或多个关系
- 您需要将删除的结果以正确的顺序附加到第二个查询中
- 可能会使代码的性能比从数据库中保存的性能更高
- 案例仅限于加载到同一实体上的两个或多个关系
- 您需要将删除的结果以正确的顺序附加到第二个查询中
- 可能会使代码的性能比从数据库中保存的性能更高
- 不,不太可能
您提供的示例是一个例外,没有任何信息表明任何用户都将出现在发送方和接收方查询中
在这种情况下,你可以编写一些代码来改变雄辩的行为,但这不值得
缺点:
foreignKey
和localKey
类消息扩展模型
{
public function sender(): HasOne
{
return $this->hasOne(User::class, 'sender_id', 'id');
}
public function receiver(): HasOne
{
return $this->hasOne(User::class, 'receiver_id', 'id');
}
}
然后使用此模型进行查询
return Message::query()->with(['sender', 'receiver'])->get()
试试这些
首先更换foreignKey
和localKey
类消息扩展模型
{
public function sender(): HasOne
{
return $this->hasOne(User::class, 'sender_id', 'id');
}
public function receiver(): HasOne
{
return $this->hasOne(User::class, 'receiver_id', 'id');
}
}
然后使用此模型进行查询
return Message::query()->with(['sender', 'receiver'])->get()
尝试以下
Message::with(['sender','receiver'])->groupby('sender.id','senders.id')->get()
@Droid不工作。请尝试使用(['sender','receiver'])->groupby('sender.id','senders.id')->get()执行此消息::代码>@Droid不工作。哦,好的。你真的认为,它增加了比避免的更多的开销吗?@shaedrich想象它是这样的(['sender'=>function($query){$query->orderBy('nick_name')->->>orderBy('first_name');}])
现在你必须替换删除到列表中的结果,并遵守所需的顺序。在PHP代码中需要数据库的逻辑:)恐怕我没有理解你的意思。只要我在with()
参数数组中没有任何函数附加到该关系,查询就应该是相同的。@shaedrich你是对的,但在开发功能时,它需要对所有其他功能有效,而不是例外。否则,您将得到大量的if()
和一大堆要调试的东西。您是对的。谢谢你的深思熟虑哦,好的。你真的认为,它增加了比避免的更多的开销吗?@shaedrich想象它是这样的(['sender'=>function($query){$query->orderBy('nick_name')->->>orderBy('first_name');}])
现在你必须替换删除到列表中的结果,并遵守所需的顺序。在PHP代码中需要数据库的逻辑:)恐怕我没有理解你的意思。只要我在with()
参数数组中没有任何函数附加到该关系,查询就应该是相同的。@shaedrich你是对的,但在开发功能时,它需要对所有其他功能有效,而不是例外。否则,您将得到大量的if()
和一大堆要调试的东西。您是对的。谢谢你的思考(Y)谢谢你的努力,但是除了更正我的伪代码外,它的功能与我的代码完全相同。这并没有改善即时加载。感谢您的努力,但除了更正我的伪代码外,它的功能与我的代码完全相同。这并不能改善即时加载。