如何使用hasMany()方法和复合外键?

时间:2016-02-05 12:54:17

标签: php laravel-5 eloquent

我有以下结构:

enter image description here

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_idbranch_has_language_language_id列构建了外键。因此我无法在hasMany()方法中定义它。

你能帮我解决这个问题吗?

2 个答案:

答案 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 *方法中定义本地密钥,外键和表名。

此致