Laravel Eloquent Relationship - 将数据插入多个表格

时间:2016-03-15 11:40:35

标签: php mysql database laravel eloquent

我有以下结构:

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();
    });

Actors Table Schema:

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>

我使用以下控制器方法从表单发布数据并且一切正常但当我提交2部具有相同类型的电影时,示例&#34;动作/剧情&#34;,我将获得2个单独的条目在流派表格中:

id:1 名称:动作/戏剧

id:2 名称:动作/戏剧

一次又一次地为特定类型使用单个ID的最佳方法是什么?例如,如果我添加10个具有流派类型&#39;动作/戏剧&#39;的电影,那么&#39; genre_id&#39;电影中的外键&#39; table应该只显示一个特定的id,它对应于类型表&#39; Action / Drama&#39; 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

注意:我还有一个数据透视表,它将电影与演员联系起来以促进多对多关系,但我还没有把它包括在内。

1 个答案:

答案 0 :(得分:4)

嗯,你每次明确地保存一个新的类型,这就是为什么你得到重复。你想做的是像

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

然后你将电影分配到流派