【问题标题】:Laravel One-to-many relationshipLaravel 一对多关系
【发布时间】:2018-04-20 07:57:13
【问题描述】:

试图在 Laravel 5.4 中建立一对多的关系。我已经在线阅读了文档和其他资源,但在每种情况下都无法使其正常工作,而且我尝试过的各种方法都会导致不同的错误。

我有以下三个表:

  • 帐户
  • 联系人
  • account_contact(数据透视表)具有以下字段:account_id(int/外键)、contact_id(int/外键)、primary (int)、billing (int)

我正在努力使该帐户可以(但不一定)拥有一个或多个联系人。

我的模型如下:

帐户

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

联系

public function account()
{
    return $this->belongsTo(Account::class)->withPivot('primary', 'billing');      
}

然后在我尝试的控制器中说:

$account = Account::find($id);
if($account->isEmpty())
    return response()->json(['Account not found.'], 404);
$contact = $account->contacts()->exists();

我收到以下错误:

(1/1) BadMethodCallException 方法联系人不存在。

显然,我想要做的是,当建立联系时,它可以通过数据透视表附加到帐户。 在获取客户时,我可以通过数据透视表获取额外的数据透视表字段,以及属于该客户的联系人。


为了进一步澄清,我正在尝试使用 eloquent,使用枢轴来执行以下查询,而不必在每个实例中都写出来。

$contacts = DB::table('account_contact')
                    ->select('contact_id', 'primary', 'billing')
                    ->where('account_id', $id)
                    ->get();
$accountContacts = [];
foreach($contacts as $c){
    $accountContact = Contact::find($c->id);
    $accountContacts[] = array( 
                    "id" => $accountContact->id,
                    "sal" => $sal = $accountContact->salutation == null? '' : $accountContact->salutation,
                    "firstName" => $accountContact->first_name,
                    "lastName" => $accountContact->last_name,
    );
}

我希望能够做类似的事情 $accounts->pivot->联系人 并得到这样的名字: $accounts->pivot->联系人->first_name

【问题讨论】:

  • 所以account_contact 是您的桥接表,它只有两个表的相关列。我说的对吗?
  • @HimanshuUpadhyay 是的,我已经更新了问题以显示列
  • 拥有数据透视表意味着您拥有多对多关系,而不是一对多关系。
  • @apokryfos 好的,那么我将如何使用中间表设置这种关系?

标签: php eloquent pivot-table laravel-5.4


【解决方案1】:

你们的关系是多对多的,所以你需要这样做:

帐户

public function contacts()
{
    return $this->belongsToMany(Contact::class)->withPivot('primary', 'billing');
}

联系

public function account()
{
    return $this->belongsToMany(Account::class)->withPivot('primary', 'billing');      
}

那你应该一直通过 eloquent 来避免N+1 issue

$account = Account::with("contacts")->where("id", $id)->get();

foreach ($account->contacts as $contact) {
      $accountContacts[] = array( 
            "id" => $accountContact->id,
            "sal" => $sal = $accountContact->salutation == null? '' : 
             $accountContact->salutation,
            "firstName" => $accountContact->first_name,
            "lastName" => $accountContact->last_name,
      );
}

【讨论】:

  • 问题是,它不是多对多的。一个客户可以有多个联系人,但一个联系人不能属于多个客户。这个答案仍然适用吗?
  • 如果一个联系人不能属于多个帐户,那么您应该在联系人表中有account_id 并且没有枢轴,因为枢轴不会施加您提到的约束。此答案适用于您有支点时。只要表结构合适,Account::with 部分也适用于一对多关系。
  • 谢谢,成功了。将它保留为多对多,因为它可以以任何方式工作。
【解决方案2】:

在您的 account 模型中,建立如下关系:

public function account_contact()
{
    return $this->belongsToMany('App\Account', 'account_contact', 'account_id', 'contact_id');
}

然后使用您编写的函数获取。我希望它会奏效。 请试试这个,告诉我它是怎么回事。

【讨论】:

  • 我会离开我的电脑一段时间,但我会用我的手机检查你的 cmets。如果它不起作用,请多多包涵。当我回来时,我会检查它。希望我不会因为帮助而投反对票。
  • 当然不是,我感谢所有的帮助:) 不要期望马上得到答案。现在将对此进行测试。
  • 没用,仍然得到错误的方法调用,但是根据更新的函数名称使用 account_contact 而不是联系人。 方法 account_contact 不存在。
猜你喜欢
  • 2018-06-15
  • 2018-09-27
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多