Laravel 8急切加载,如何访问子查询字段



正常运行:

$clients = Client::with([
'contacts' => function ($query) {
$query
->select('client_id', 'first_name', 'last_name')
->where('contact_type_id', '=', 1);
}])
->orderBy('client_name')
->get(['id', 'client_name', 'city', 'state']);
dd($clients);

但是,我不确定如何访问子查询上的first_name和last_name。他们出现在"关系"中;对象在转储,但在我的脑海中,我设想一个数据集,我将访问,如,

客户→美元first_name等。

当我尝试在最后将字段添加到get()方法时,它不识别它们,所以我做错了什么,或者我需要以不同的方式访问子查询字段。

当你急于加载关系时,你只是在预加载它们。

如果你的关系被定义为hasMany(这里的情况似乎是Client hasMany Contact),那么你总是会从急切加载得到一个集合。

如果您在模型中定义了另一个关系,以便只获得一个结果,例如:

public function contact()
{
return $this->hasOne(Contact::class)->where('contact_type_id', 1)->latest('id');
}

你的新关系contact将只返回一个结果:

$clients = Client::with('contact')
->orderBy('client_name')
->get(['id', 'client_name', 'city', 'state']);
foreach($clients as $client){
dd($client->contact->first_name);
}
// each Client of $clients would have a ->contact relationship

应该在子查询中为select()方法添加字段id,为get()方法添加字段contact_id

$clients = Client::with(['contacts' => function ($query) {
$query->select('id', 'client_id', 'first_name', 'last_name')->where('contact_type_id', '=', 1);
}])
->orderBy('client_name')
->get(['id', 'client_name', 'city', 'state', 'contact_id']);
foreach ($clients as $key => $client) {
dd($client->contacts->first_name);
// Or
dd($client->contacts()->first()->first_name);
}

最新更新