Laravel Eager Load 在条件关系中变为空

Posted

技术标签:

【中文标题】Laravel Eager Load 在条件关系中变为空【英文标题】:Laravel Eager Load become null in conditional relationship 【发布时间】:2021-11-14 16:19:54 【问题描述】:

我在几天后才解决这个问题。

就我而言,有一个学生获得了学者。但是学生桌和学者会员桌是不同的。有停用的学生身份日期。学生每月获得 70 美元,条件是学生仍然活跃,或者如果学生身份停用(辍学/突变到其他学校),但月份的期限小于停用日期。

当经理想看到与停用学生一起接收奖学金的学生时,就会出现问题

型号

student 
   id, student_number, name, status


scholar_student 
  id, student_number, start_registered(date), deactivated(date)  

关系:

在学者模型中

public function Student() 
   return $this->belongsTo(Student::class,'student_number','student_number')->when($this->status,function($q)
      $q->where('status','active');
   );

如何在管理器中获取学生学者名单:

$data = StudentScholar::with('Student')->get();

如果我使用with 添加条件status 的功能总是被跳过。如果我不使用它会查询。如果我不使用with,性能会变得很慢。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您可以创建两个单独的方法来获取活跃和不活跃的学生。

public function ActiveStudent()
   return $this->belongsTo(Student::class,'student_number','student_number')->when($this->status,function($q)
      $q->where('status','active');
   );


public function InactiveStudent()
   return $this->belongsTo(Student::class,'student_number','student_number')->when($this->status,function($q)
      $q->where('status','inactive');
   );

获取学生列表时

$data = StudentScholar::with('ActiveStudent','InactiveStudent')->get();

【讨论】:

以上是关于Laravel Eager Load 在条件关系中变为空的主要内容,如果未能解决你的问题,请参考以下文章

Eager-load 相同的关系,不同的约束

Eloquent Eager Load Constraints 返回 JSON String 而不是 Object

Laravel Eloquent Where and or Where with Eager Load 无法正常工作

从只有 MATCH 和 CREATE 关系的 Cypher LOAD CSV 中删除 EAGER

Laravel - Eager Loading BelongsToMany 关系

从与“Lazy Eager Loading”的关系中返回第一个元素 [Laravel 5.2]