【问题标题】:Laravel relation displaying null on eager loadLaravel 关系在急切加载时显示 null
【发布时间】:2019-11-27 19:27:38
【问题描述】:

一个 Laravel 关系在急切加载时显示为空。但是,当关系被正常访问时,它就可以工作。

class Student extends Model
{
    use SoftDeletes;

    public $incrementing = false;
    protected $primaryKey = 'id'; // or null
    protected $guarded = [];

    public function document()
    {
        return $this->hasOne('App\Model\Document');
    }

    public function contact()
    {
        return $this->hasOne('App\Model\Contact');
    }
}

当我使用以下时,合同关系返回 null。

Student::with('contact')->get()

但是,当我执行以下操作时它会起作用。这可能是什么原因?

$student = Student::findOrFail($id);
$contact = $student->contact;

【问题讨论】:

  • 查看eager loading的示例
  • 也许这段代码对你有帮助:$students = Student::with(array('contact' => function($query) { $query->select('id','phone'); }))->get();

标签: php laravel laravel-6


【解决方案1】:

Student::with('contact')->get(); 返回一个CollectionStudent 实例,您可以循环并访问contact 关系:

$students = Student::with('contact')->get();
foreach($students AS $student){
  dd($student->contact); 
  // Can be `null` or an instance of `Contact`
}

当您调用Student::findOrFail($id); 时,您将获得Student 的单个实例,您可以直接访问contact

$student = Student::with('contact')->findOrFail($id);
dd($student->contact);
// Again, can be `null` or an instance of `Contact`

with() 子句是即时加载,在您尝试访问$student->contact 之前不会执行任何操作,但由于hasOne() 的性质,它可以是null

【讨论】:

  • ``` public function ajaxData(Request $request){ return DataTables::of(Student::with('contact')->get())->toJson(); } ```
  • 那我该如何使用这个语句呢?
  • 这将创建一个DataTableStudent 记录,并转换为JSON,并具有student.contact 可用属性,即nullJSON 版本的联系人。我不熟悉您在那里定义的DataTable 用法,但无论哪种方式,它都是一组记录,而不是一条记录(这是findOrFail() 的结果)
  • 我认为你错了,急切加载使用连接语句,因此即使 $student->contact 未被调用,它也不能为空
  • @FaseihSaad Laravel 关系(无论是否加载)不使用 sql 连接语句。它们是完全独立的查询,并且在查询运行后匹配水合模型。
猜你喜欢
  • 2017-09-09
  • 1970-01-01
  • 2021-12-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2017-09-30
相关资源
最近更新 更多