【问题标题】:Laravel 8 eloquent missing 1 field while creating a sql queryLaravel 8 eloquent 在创建 sql 查询时缺少 1 个字段
【发布时间】:2021-11-11 03:50:24
【问题描述】:

我遇到了 eloquent 的问题,我有一个控制器有这样的代码

$pivot = MovieGenre::where('movie_id', $id)->delete();
        if($request->input('genres')){
            foreach ($request->input('genres') as $genre) {
                $pivot = MovieGenre::create([
                    'movie_id' => $id,
                    'genre_id' => $genre,
                ]);
            }
        }

例如还有 2 个相同的枢轴正在工作,这些枢轴是相同的,并且控制器的制作方式相同 当我尝试使用它时,我收到了一个错误

此查询在查询中缺少“genre_id”,但我在数据透视模型的 CREATE 方法中给出了该字段。 模型文件为空。只是'扩展枢轴'

【问题讨论】:

  • 当你像普通模型一样直接使用Pivot时,为什么要扩展它?
  • @lagbox 哦,我以为这是在那里添加记录的唯一方法,还有其他方法吗?
  • 自定义数据透视模型用于在您的模型之间使用“属于多方关系”设置时使用...您可以让您的 MovieGenre 模型扩展 Model 并使这些字段可填写
  • @lagbox 我有 belongsToMany 关系,这就是它扩展支点的方式
  • 您在该示例中根本没有使用该关系,而是直接与数据透视表交互;在这个例子中没有 Eloquent 关系......如果你使用从电影到流派的实际关系,你可以用 1 行代码完成你现在正在做的所有事情

标签: laravel eloquent


【解决方案1】:

您没有在此处使用从 Movie 模型到 Genre 模型的关系。您正在直接与数据透视表交互(此时它只是一个常规模型,而不是自定义数据透视表)。

如果您使用从MovieGenre 的关系,您可以简化所有这些:

class Movie extends Model
{
    public function genres()
    {
        // convention would name the table genre_movie
        return $this->belongsToMany(Genre::class, 'movie_genre')->withTimestamps();
    }
}

Movie::findOrFail($id)->genres()->sync((array) $request->input('genres'));

Laravel 8.x Docs - Eloquent - Relationships - Many to Many - Retrieving Intermediate Table ColumnswithTimestamps

Laravel 8.x Docs - Eloquent - Relationships - Inserting & Updating Related Models - Many to Many - Syncing Associationssync

如果您不想使用关系,则将 MovieGenre 设为常规模型并将这些字段设置为可填充:

class MovieGenre extends Model
{
    protected $fillable = [
        'movie_id',
        'genre_id',
    ];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2022-01-17
    相关资源
    最近更新 更多