Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用同一类型的多个关系改进即时加载_Php_Laravel_Eloquent_Laravel 8_Eager Loading - Fatal编程技术网

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)谢谢你的努力,但是除了更正我的伪代码外,它的功能与我的代码完全相同。这并没有改善即时加载。感谢您的努力,但除了更正我的伪代码外,它的功能与我的代码完全相同。这并不能改善即时加载。