【问题标题】:Laravel Eloquent how to access distant relationship's dataLaravel Eloquent 如何访问远程关系的数据
【发布时间】:2021-08-31 14:17:05
【问题描述】:

我有一个客户表、一个client_contacts 表和一个contact_type 表。客户端是 1:m 与 client_contactsclient_contacts 是 1:1 与 contact_type

这个想法是客户可以有一个主要联系人、一个帐单联系人等。

我正在尝试同时获取给定的客户和联系人,以及联系人类型的描述。所以在 SQL 中应该是这样的:

SELECT c.*, cc.*, ct.contact_type_description
FROM client c
JOIN client_contacts cc ON c.id = cc.client_id
JOIN contact_types ct ON cc.contact_type_id = ct.id
WHERE c.id = 1

根据我的阅读,我需要为此使用HasManyThrough

我是这样设置的:

客户端模型

class Client extends Model
{
    use HasFactory;

    protected $fillable = [
        'client_name',
        'address',
        'city',
        'state',
        'zip',
    ];

    public function contacts()
    {
        return $this->hasMany(Contact::class);
    }

    public function contactTypes()
    {
        return $this->hasManyThrough(ContactType::class, Contact::class);
    }
}

联系模特

class Contact extends Model
{
    use HasFactory;

    public function contactType() 
    {
        return $this->hasOne(ContactType::class);
    }
}

联系人类型模型

class ContactType extends Model
{
    use HasFactory;

    protected $guarded = [];

    public function contact()
    {
        return $this->belongsTo(Contact::class);
    }
}

在我的控制器中,我现在只是尝试 d​​d() 数据。

public function edit(Client $client)
{    
  $contacts = $client->contacts;
  $ct = $client->contactTypes();
  dd($ct);

  return Inertia::render('Clients/Edit', [
    'client' => [
        'id' =>  $client->id,
        'client_name' => $client->client_name,
        'address' => $client->address,
        'city' => $client->city,
        'state' => $client->state,
        'zip' => $client->zip,
    ],
    'contacts' => $contacts
  ]);
}

这会产生一个结果,但我没有在结果中看到 ContactType 数据。我做错了什么?

【问题讨论】:

    标签: php laravel eloquent laravel-8


    【解决方案1】:

    你需要触发查询:

     $ct = $client->contactTypes()->get();
    

    【讨论】:

      【解决方案2】:

      您可以使用 with 预先加载您的关系

      return Inertia::render('Clients/Edit', [
          'client' => function() use($client)
         {
           return Client::where('id', $client->id)->with(['contacts', 'contactTypes'])->first();
          }
          ],
      

      【讨论】:

      • 这很好,我可以看到关系已经填充,但是如何在前端将关系连接在一起?我想我无法理解 Laravel 的回复以及我会怎么说,客户 A 的联系人姓名和联系人类型?我本来希望有一个 Clients 对象,其中包含一个包含联系人的对象数组。查看从服务器返回的内容,它们似乎位于不同的对象中。也许这是一个新问题..我不知道。
      • @hyphen 你可以尝试使用nested eager loadingwith(['contacts.contactType']),这样它就会通过contacts 关系,然后到contactTypecontacts
      • @hyphen 我猜你现在已经发现了。但对于前端来说,这一切都只是一个大对象。因此,您可以使用client.contacts[0].nameclient.contactTypes[0].name 访问某些内容
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 2017-02-17
      • 1970-01-01
      • 2015-03-09
      • 2015-06-27
      • 1970-01-01
      • 2019-08-11
      相关资源
      最近更新 更多