我刚开始使用laravel,但是我仍然坚持这一点,但我找不到解决方法

基本上,我插入带有类别的文章。

使用select2,可以选择一个现有类别或创建一个新类别。

我的文章模型:

public function category(){
    return $this->belongsTo('App\Category');
}


我的类别模型:

public function articles(){
    return $this->hasMany('App\Article');
}


我的文章迁移:

public function up()
{
    Schema::create('articles', function (Blueprint $table) {
        $table->increments('id');
        $table->string('title');
        $table->longText('content')->nullable();
        $table->timestamps();
    });
}


我的类别迁移:

Schema::create('categories', function (Blueprint $table) {
        $table->increments('id');
        $table->string('nom')->unique();
    });

    Schema::table('articles', function(Blueprint $table){
        $table->integer('category_id')->unsigned()->index();
    });


最后是我的控制器功能,用于存储文章(我想使用事务):

public function store(Request $request)
{
    $this->validate($request, [
        'numero' => 'required',
        'category' => 'required',
        'title' => 'required'
    ]);
    $article = new Article();
    DB::transaction(function() use ($request) {
       $category = Category::firstOrCreate(['nom' => $request->input('category')]);
       $article->title = $request->input('title');
       $article->save();
    });
    return response()->json([
        'title' => $article->title
    ]);
}


所以我知道我没有将类别ID保存到article db中,但是我的类别甚至没有插入,在调试栏中我得到了以下信息:


  开始交易
  从batiments中选择*其中(nom ='HI')限制1
  回滚交易


我的帖子页面给我这个错误:


  SQLSTATE [23000]:违反完整性约束:1062 Duplicata du champ''pour la clef'batiments_nom_unique'(SQL:插入batiments()值())


有人知道如何在商品表中插入或选择是否存在类别并插入ID?

谢谢

最佳答案

$table->integer('category_id')->unsigned()->index();

您将此字段设置为索引,只需删除index()。标识字段必须仅具有唯一记录,但是您的category_id可能具有相同的值很多次。

09-27 04:51