Laravel一对多的关系

时间:2017-11-07 19:28:26

标签: php eloquent pivot-table laravel-5.4

尝试在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,使用pivot来执行以下查询,而不必在每个实例中都写出来。

$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-> contacts-> first_name的

2 个答案:

答案 0 :(得分:2)

您的关系很多,所以您需要这样做:

帐户

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

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

然后你应该通过雄辩的方式一直这样做,以避免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,
      );
}

答案 1 :(得分:0)

account模型中,建立一个这样的关系:

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

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