2016-03-15 102 views
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'); 
} 

輸出表應該是這個樣子:

enter image description here

注:我也有一個數據透視表這是連接電影與演員,以促進多對多的關係,但我沒有把它包括在這裏。

回答

4

那麼你每次都明確地保存一個新的流派,這就是爲什麼你得到重複。你想要做的是一樣的東西

$genre = Genre::firstOrCreate("name", $request->input('genre')); 

然後,你的電影分配給流派

+0

真棒醬!我已經將流派和演員的邏輯改爲firstOrCreate。這是否意味着我可以使用firstOrNew方法創建新電影?這意味着如果電影已經存在於數據庫中,它不應該重複? – Daybreak

+0

正確,如果你不想重複電影名稱,我會採取同樣的方法。 – btl