2016-03-15 67 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