2016-02-05 18 views
2

我有以下結構:如何使用具有複合外鍵的hasMany()方法?

enter image description here

branch_has_language表代表了語言和分支機構之間的多對多關係。另一方面,產品屬於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()方法中定義它。

能否請你幫我解決這個問題?

回答

1

如果表引用外國id它屬於它,否則它有它。在語言和分支模型中,與數據透視相關的方法應引用爲hasMany()

反正我不明白你爲什麼會是這樣複雜,這可能僅僅是一個典型的多對多與branch_language的名稱。 Laravel理解本身,它是一個多對多的,如果你與_和字母順序排列連接的表名的奇異版本調用它。

然後在產品表的遷移您要用作數據透視表的外國名字引用它。

$table->unsignedInteger('branch_language_id'); 
$table->foreign('branch_language_id') 
    ->references('id') 
    ->on('branch_language') 
    ->onDelete('restrict'); // not necessary 
+1

你說得對。我的頭腦在Laravel中太多了,並且無法意識到數據庫模式中存在「錯誤」。謝謝! –

+0

它總是發生在我身上,別擔心=] – phaberest

0

這是無法通過關係有很多?

https://laravel.com/docs/5.2/eloquent-relationships#has-many-through

可以定義局部鍵,外鍵和表名中的hasMany *方法。

問候

+0

我不確定,但我認爲這並沒有幫助我,因爲我在左邊有兩張桌子。你將如何在我的情況下實施該方法? –

+0

實際上並非如此。當您必須引用屬於另一個表的表的列時,纔有直通關係。像「城市」 - >「省份」 - >「地區」 - >「國家」。 – phaberest