Laravel Eloquent:基于条件获取关联数据

Laravel Eloquent:基于条件获取关联数据

laravel 开发中,Eloquent ORM 提供了便捷的方式来处理数据库交互。当需要基于关联模型的条件来筛选主模型数据时,whereHas 方法是一个强大的工具。它允许我们只获取那些关联模型满足特定条件的记录,从而避免加载不必要的数据,提升查询效率。

假设我们有两个模型:user 和 orders,它们之间存在 belongsto 关系。我们的目标是获取所有 user 模型的 id 和 name,但仅限于那些 orders 模型满足 order 字段为 false 且 uploadid 字段为 NULL 的用户。

使用 with 方法加载关联关系并不能直接达到筛选主模型的目的。with 方法会加载所有 User 模型及其关联的 Orders 模型,然后在结果集中进行筛选,效率较低。

正确的做法是使用 whereHas 方法:

$data = User::whereHas('orders', function ($query) {     $query->where('order', false);     $query->whereNull('uploadId'); })->pluck('name', 'id');

这段代码的含义是:

  1. User::whereHas(‘orders’, …): 从 User 模型开始查询,并且只选择那些关联关系 orders 满足特定条件的 User 模型。
  2. function ($query) { … }: 这是一个闭包函数,它接收一个 $query 对象,允许我们定义关联关系 orders 需要满足的条件。
  3. $query->where(‘order’, false);: 添加一个条件,要求 Orders 模型的 order 字段为 false。
  4. $query->whereNull(‘uploadId’);: 添加一个条件,要求 Orders 模型的 uploadId 字段为 null。
  5. ->pluck(‘name’, ‘id’);: 从满足条件的 User 模型中,提取 name 和 id 字段,并以 id 作为键,name 作为值,生成一个关联数组

User 模型定义:

namespace AppModels;  use IlluminateDatabaseEloquentModel;  class User extends Model {     public function orders()     {         return $this->belongsTo(Orders::class, 'order_userId', 'id');     } }

Orders 模型定义(示例):

namespace AppModels;  use IlluminateDatabaseEloquentModel;  class Orders extends Model {     // ... 其他代码 }

注意事项:

  • whereHas 方法实际上是在数据库层面进行筛选,因此性能优于先加载所有数据再进行筛选。
  • 确保 User 模型中定义了正确的 orders 关联关系。
  • 根据实际情况调整 where 条件,以满足特定的业务需求。
  • 如果需要获取更多字段,可以调整 pluck 方法的参数。例如,如果需要获取所有字段,可以省略 pluck 方法。

总结:

whereHas 方法是 Laravel Eloquent 中一个强大的工具,用于基于关联模型的条件来筛选主模型数据。通过合理使用 whereHas 方法,可以避免不必要的数据加载,提升查询性能,并使代码更加简洁易懂。在处理复杂的关联查询时,whereHas 方法是一个值得掌握的技巧。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享