4
我有以下結構:Laravel雄辯的關係 - 將數據插入到多個表
3個表:電影,演員,流派
電影表模式:
Schema::create('movies', function (Blueprint $t) {
$t->increments('id');
$t->string('title');
$t->integer('genre_id')->unsigned();
$t->foreign('genre_id')->references('id')->on('genres');
$t->string('genre');
$t->timestamps();
});
流派表架構:
Schema::create('genres', function (Blueprint $t) {
$t->increments('id');
$t->string('name');
$t->timestamps();
});
個
演員表模式:
Schema::create('actors', function (Blueprint $t) {
$t->increments('id');
$t->string('name');
$t->timestamps();
});
電影模態:
public function genre()
{
return $this->belongsTo('App\Genre');
}
public function actor()
{
return $this->belongsToMany('App\Actor');
}
類型莫代爾:
public function movie()
{
return $this->hasMany('App\Movie');
}
演員模態:
public function movie()
{
return $this->belongsToMany('App\Movie');
}
表:
<form method="post" action="{{ route('movies.insert') }}">
<input type="text" name="movieName" id="movieName">
<input type="text" name="actorName" id="actorName">
<input type="text" name="genre" id="genre">
<button type="submit">Add</button>
</form>
我使用下面的控制器方法從表單POST數據和一切工作正常,但是當我提出2部電影與同類型,例如「行動/戲劇」,我得到2個獨立的條目流派表所示:
ID:1 名稱:動作/劇情
id:2 name:動作/戲劇
什麼是反覆使用一個特定流派類型的單個id的最佳方法?例如,如果我添加10個類型爲「動作/戲劇」的電影,那麼'電影'表中的'genre_id'外鍵應該只顯示一個與流派表的'動作/戲劇'ID相對應的特定ID。希望是有道理的:/
控制器的方法:
public function addMovies(Request $request)
{
$genre = new Genre;
$genre->name = $request->input('genre');
$genre->save();
$movie = new Movie;
$movie->title = $request->input('movieName');
$movie->genre = $request->input('genre');
$movie->genre()->associate($genre);
$movie->save();
$actor = new Actor;
$actor->name = $request->input('actorName');
$actor->save();
$actor->movie()->save($movie);
return redirect()->route('movies.search');
}
輸出表應該是這個樣子:
注:我也有一個數據透視表這是連接電影與演員,以促進多對多的關係,但我沒有把它包括在這裏。
真棒醬!我已經將流派和演員的邏輯改爲firstOrCreate。這是否意味着我可以使用firstOrNew方法創建新電影?這意味着如果電影已經存在於數據庫中,它不應該重複? – Daybreak
正確,如果你不想重複電影名稱,我會採取同樣的方法。 – btl