laravel 5.3 关系模型使用非默认键

Posted

技术标签:

【中文标题】laravel 5.3 关系模型使用非默认键【英文标题】:laravel 5.3 relation model using not default keys 【发布时间】:2016-10-25 02:41:48 【问题描述】:

我没有使用主键/外键命名约定。我已经建立了模型之间的关系,但是我收到了这个消息。 => Illuminate\Database\Eloquent\Relations\BelongsTo #617

以下是我的关系:国籍有很多血缘关系。

同类模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Kindred extends Model

//kindreds
protected $primaryKey = "id_kindred";

protected $table = "kindreds";

protected $fillable =     ['id_kindred','nombre_kindred','gender_kindred','bd_kindred','works_kindred','company_kindred','notes_kindred','id_natio_fk','id_mar_sta_fk','id_aller_fk','id_treat_fk','id_educa_fk','id_relat_fk','id_type_kindr_fk','id_fam_gro_fk','id_natio_fk','id_mar_sta_fk','id_aller_fk','id_treat_fk','id_educa_fk','id_relat_fk','id_type_kindr_fk','id_fam_gro_fk'];

public function Nationality()

    return $this->belongsTo('App\Models\Nationality', 'id_natio_fk' );


public function Marital_status()

    return $this->belongsTo('App\Models\Matrital_status' , 'id_mar_sta');

国籍模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Nationality extends Model

protected $primaryKey ="id_natio";
protected $table = "nationalities";

protected $fillable = ['nombre_natio'];

public function kindreds()

    return $this->hasMany('app\Models\Kindred' , 'id_natio_fk');

这是我在 tinker 命令行上执行的代码。

>>> $k = App\Models\Kindred::find(111111111);
=> App\Models\Kindred #636
 id_kindred: "111111111",
 nombre_kindred: "First Last",
 gender_kindred: "3",
 bd_kindred: "0000-00-00",
 works_kindred: 1,
 company_kindred: "Company",
 notes_kindred: "",
 id_natio_fk: 1,
 id_mar_sta_fk: 1,
 id_aller_fk: 1,
 id_treat_fk: 1,
 id_educa_fk: 1,
 id_relat_fk: 1,
 id_type_kindr_fk: 1,
 id_fam_gro_fk: 1,
 created_at: "2016-10-24 04:21:07",
 updated_at: "2016-10-24 04:21:07",
 
 >>> $k->Nationality()
  => Illuminate\Database\Eloquent\Relations\BelongsTo #617

【问题讨论】:

【参考方案1】:

您还需要通过将附加参数传递给hasManybelongsTo 方法来覆盖本地键。默认情况下它假定id,在您的情况下是id_kindredid_nation

return $this->hasMany('App\Model', 'foreign_key', 'local_key');

所以, 同类模型:

public function Nationality()

    return $this->belongsTo('App\Models\Nationality', 'id_natio_fk', 'id_kindred' );

国籍模型:

public function kindreds()

    return $this->hasMany('app\Models\Kindred' , 'id_natio_fk','id_nation');

【讨论】:

嗨,Sanzeeb,我采纳了您的建议,但没有奏效,我收到一条错误消息,提示 id_kindred 列不在国籍表中。 (这很好)所以我尝试了这个,它完美地工作了 Kindred Model: public function Nationality() return $this->belongsTo('App\Models\Nationality', 'id_natio_fk' , 'id_natio' ); 国籍模型 public function Kindreds() return $this->hasMany('app\Models\Kindred' , 'id_natio_fk','id_natio');如果你看看我添加了 id_natio 而不是 id_kindred,有什么想法吗? @AndréDeLaOCampos 好吧,第三个参数是父表的本地键。我想到了id_kindred,很高兴你解决了它。【参考方案2】:

您正在尝试显示一种关系。试试这个

$k->Nationality; // without the '()'

应显示国籍或为空。

【讨论】:

感谢您检查问题,我遵循了@Sanzeeb 的建议以及您的建议,最后经过一些额外的修复,它工作得很好。

以上是关于laravel 5.3 关系模型使用非默认键的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.3 多态关系

在同一张表上定义关系 Laravel 5.3

Laravel 5.3 使用 with() 方法预先加载关系

Laravel Eager Loading 和动态绑定模型关系

如何在 Laravel 雄辩关系中添加多个条件

Laravel 5.3 Eloquent 关系 - 用户、角色、页面和权限