Laravel Eloquent 关系 - 将数据插入多个表

Posted

技术标签:

【中文标题】Laravel Eloquent 关系 - 将数据插入多个表【英文标题】:Laravel Eloquent Relationship - Inserting data into multiple tables 【发布时间】:2016-06-30 20:03:34 【问题描述】:

我有以下结构:

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>

我正在使用以下控制器方法从表单中发布数据,一切正常,但是当我提交 2 部具有相同流派的电影时,例如“动作/戏剧”,我在流派表中获得 2 个单独的条目,例如:

id: 1 名称:动作/戏剧

id:2 名称:动作/戏剧

对特定流派类型反复使用单个 id 的最佳方法是什么?例如,如果我添加了 10 部流派类型为“动作/戏剧”的电影,那么“电影”表中的“流派 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');

输出表应如下所示:

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

【问题讨论】:

【参考方案1】:

你每次都明确地保存一个新的流派,这就是你得到重复的原因。你想做的是像

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

然后您将电影分配给流派

【讨论】:

酱汁真棒!我已将流派和演员逻辑都更改为 firstOrCreate。这是否意味着我可以使用 firstOrNew 方法来创建新电影?这意味着如果数据库中已经存在电影,则不应重复? 正确,如果您不想重复电影标题,我会采用相同的方法。

以上是关于Laravel Eloquent 关系 - 将数据插入多个表的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Controller Laravel belongsToMany 关系中获取正确的数据 - Laravel / Eloquent [关闭]

Laravel Eloquent:通过具有多个关系的枢轴将表绑定到另一个表

Laravel 关系上的枢轴关系 (Eloquent)

如何将参数传递到链式 Laravel Eloquent 关系中的位置

Laravel 8.x - 使用 Eloquent 关系存储数据

Laravel Eloquent 在结果中附加一个非关系数据