【问题标题】:Laravel 8 eager loading, how to access subquery fieldsLaravel 8 急切加载,如何访问子查询字段
【发布时间】:2021-08-26 14:22:27
【问题描述】:

这是有效的:

$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。它们出现在转储中的“关系”对象中,但在我看来,我正在设想一个我想访问的数据集,

$client->first_name 等

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

【问题讨论】:

  • 如果客户可能有很多联系人,您可以通过$client->contacts->first()->first_name 访问它们;如果客户只有一个联系人,您可以通过$client->contacts->first_name 访问它们(尽管在这种情况下,将关系命名为contacts 具有误导性)跨度>
  • 好的,是的,他们有多个联系人,但在这个特定的查询中,我将其限制为仅基于类型的一个联系人。
  • 感谢您的帮助!

标签: laravel eloquent laravel-8


【解决方案1】:

当您急切加载关系时,您只是在预加载它们。

如果你的关系被定义为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

【讨论】:

    【解决方案2】:

    您应该将字段 id 添加到子查询中的 select() 方法,并将字段 contact_id 添加到 get() 方法

    $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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-23
      • 2014-08-30
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多