2017-05-10 59 views
0

我很難得到這個權利與Laravel 5.但是,Rails的,我可以很容易地做到這一點:Laravel多對多的關係連接兩個型號

用戶可以是一個部分很多球隊。我們知道,表UserTeam不可能有關係id所以我不會在這裏發佈這些模式,而是我有一個TeamUser表:

Schema::create('team_users', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->integer('user_id'); 
    $table->integer('team_id'); 
    $table->timestamps(); 
}); 

TeamUser.php:

public function user() 
{ 
    return $this->belongsTo(User::class); 
} 

public function team() 
{ 
    return $this->belongsTo(Team::class); 
} 

團隊.php

public function users() 
{ 
    return $this->hasManyThrough(User::class, TeamUser::class); 
} 

user.php的

public function teams() 
{ 
    return $this->hasManyThrough(Team::class, TeamUser::class); 
} 

看起來好像laravel的doc和我所看到的其他教程是不同的。我再次向Laravel求新,我需要這個設置。

廷克:

$tu = App\TeamUser::create([ 'user_id' => 1, 'team_id' => 1 ]); 

照亮\數據庫\鋒\ MassAssignmentException與消息 'USER_ID'

預期:

$tu->users // is_array($tu) to be true 

有人能解釋這裏有什麼問題嗎?非常感謝。

+1

什麼你要找的是一個透視表。你不需要'hasManyThrough',只需'hasMany'就夠了。 https://laravel.com/docs/5.4/eloquent-relationships#many-to-many應該是一個很好的參考點。 –

回答

1

據我所知,hasManyThrough()只替代鏈接2 hasMany的關係。在你的情況下,我們必須處理一個單一的many-to-many關係,該關係在涉及的兩個模型上都使用belongsToMany()定義。

爲了這個工作,你應該創建一個連接表。在Laravel中,連接表的命名約定是涉及的兩個模型的名稱,單數,snake_cased,按字母順序排列,並由_分隔。在這種情況下,表名將是team_user

你想創建通過工匠CLI遷移:

$ php artisan make:migration create_team_user_pivot_table

並把下面的內容即是爲你在YOUR_PROJECT/database/migrations/創建新類的up()down()方法裏面。

/** 
* Run the migrations. 
* 
* @return void 
*/ 
public function up() 
{ 
    Schema::create('team_user', function (Blueprint $table) { 
     $table->integer('team_id')->unsigned()->index(); 
     $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade'); 
     $table->integer('user_id')->unsigned()->index(); 
     $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 
     $table->primary(['team_id', 'user_id']); 
    }); 
} 

/** 
* Reverse the migrations. 
* 
* @return void 
*/ 
public function down() 
{ 
    Schema::drop('team_user'); 
} 

當所有的設置,你可以運行下面的控制檯命令新的遷移: $ php artisan migrate

然後,在你Team型號:

public function users() 
{ 
    return $this->belongsToMany(User::class); 
} 

,並在您User型號:

public function teams() 
{ 
    return $this->belongsToMany(Team::class); 
} 

這應該是所有你需要的關係工作。

請注意,沒有什麼能阻止您創建一個名爲TeamUser的額外模型來直接訪問您的透視/連接表。您必須在該模型中指定表名爲team_user,因爲Eloquent假定表名稱是模型名稱的複數蛇型版本:team_users。這是那麼容易,因爲:

protected $table = 'team_user';

如果額外的表的唯一目的是存儲的關係,但是,我不明白爲什麼定義模型類該表可以被認爲是有用的。 Laravel自帶a bunch of extra features that let you define and access additional columns on join tables through relationships.

(向下滾動有點保存其他方面的數據透視表

+0

信息豐富在這裏。我會去看看,並報告 – Sylar

+0

好吧,我''tu = App \ TeamUser :: create(['user_id'=> 1,'team_id'=> 1]);'然後'App \ User :: find 1) - >隊',但獲得空陣列。我確實有一個ID爲1的團隊 – Sylar

+0

1.您是否確認新記錄是在'team_user'中創建的? 2.如果您正在'工匠修補程序「中進行測試,則可能需要重新提取模型或完全重新啓動修補程序。 –

0

爲了避免看到粘貼的錯誤信息你就必須把下面幾行添加到您的TeamUser.php類:

protected $fillable = ['user_id', 'team_id']; 
0

您可以實現多到許多與中間表的關係,通過使用belongsToMany

例如在Team.php

public function users() { 
    return $this->belongsToMany(User::class, 'team_user', 'team_id', 'user_id'); 
} 

在你不需要的話創建模型TeamUser

0

工作了雄辯的關係時,我做的是說他們大聲:

  • 用戶可以是很多球隊的一部分
  • 團隊可以有很多用戶

這就是說你需要一個many-to-many關係。所以,我們做什麼我們User.php

public function teams() { 
    return $this->belongsToMany(Team::class); 
} 

然後,在我們的Team.php,我們做到這一點;

public function users() { 
    return $this->hasMany(Users::class); 
} 

這應自動進行數據透視表,並設置你的地方,你可以請求例如點一個用戶團隊在做:Users::find(1)->teams請注意,我沒有使用括號,因爲我想要的結果,而不是查詢生成器對象。

+0

與此相關的事情是Team table不可能擁有'user_id'並且它要求用戶標識 – Sylar

+1

'Team.php'中的'hasMany'是錯誤的。 'hasMany'假設返回到'Team'模型的外鍵存在於代表你試圖定義關係的模型的表中,而'belongsToMany'將假設存在一個額外的表,它通過匹配ID來定義關係。 –