我有以下结构:
branch_has_language表表示语言和分支之间的ManyToMany关系。另一方面,产品属于branch_has_language记录。因此,可以为特定语言和分支创建产品,它们在branch_has_language表中一起“存在”。
我的问题是如何创建模型以表示这种关系。目前我有以下型号:
分支模型
class Branch extends Model
{
protected $table = "branches";
public function languages()
{
return $this->belongsToMany("\App\Language", "branch_has_language");
}
public function users()
{
return $this->belongsToMany("\App\User", "branch_has_user");
}
public function newPivot(Model $parent, array $attributes, $table, $exists) {
if ($parent instanceof Language) {
return new BranchLanguage($parent, $attributes, $table, $exists);
}
return parent::newPivot($parent, $attributes, $table, $exists);
}
}
语言模型
class Language extends Model
{
protected $table = "languages";
public function branches()
{
return $this->belongsToMany("\App\Branch", 'branch_has_language');
}
public function newPivot(Model $parent, array $attributes, $table, $exists) {
if ($parent instanceof Branch) {
return new BranchLanguage($parent, $attributes, $table, $exists);
}
return parent::newPivot($parent, $attributes, $table, $exists);
}
}
BranchLanguage枢轴模型
class BranchLanguage extends Pivot
{
protected $table = 'branch_has_language';
public function branch()
{
return $this->belongsTo("\App\Branch");
}
public function language()
{
return $this->belongsTo("\App\Language");
}
public function products()
{
return $this->hasMany("\App\Product");
}
public function systems()
{
return $this->hasMany("\App\System");
}
public function items()
{
return $this->hasMany("\App\Item");
}
}
但是,如果我想在products()
课程中调用BranchLanguage
方法,则会收到错误"Column products.branch_id does not exists"
。这是对的。我需要在hasMany()
方法中指定外键。但是我的外键是复合的。
branch_has_language_branch_id
和branch_has_language_language_id
列构建了外键。因此我无法在hasMany()
方法中定义它。
你能帮我解决这个问题吗?
答案 0 :(得分:1)
如果一个表引用了它所属的外来class_name{1} = 'Type a';
class_name{2} = 'Type b';
% etc, up to
class_name{15} = 'Type o';
class_name{16} = 'Type p';
legend(class_name);
,那么它就拥有它。在语言和分支模型中,与枢轴相关的方法应引用为id
。
无论如何,我不明白为什么你会这样复杂化,这可能只是一个经典的很多人,名字为hasMany()
。 Laravel明白,如果你用branch_language
加入的表名的单数版本来命名并按字母顺序排列,那么它就是多对多的。
然后在products表的迁移中,使用您想要的名称作为数据透视表的外来名称引用它。
_
答案 1 :(得分:0)
这不是很多关系吗?
https://laravel.com/docs/5.2/eloquent-relationships#has-many-through
您可以在hasMany *方法中定义本地密钥,外键和表名。
此致