首页 > 解决方案 > Laravel 5.4 事务和一对多关系

问题描述

我刚开始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 保存到文章数据库中,但我的类别甚至没有插入,在我的调试栏上我有这个:

Begin Transaction select * from batimentswhere ( nom='HI') limit 1 回滚事务

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

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

有人知道如何插入或选择是否存在类别并将id插入到文章表中?

谢谢

标签: phpmysqllaravel

解决方案


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

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


推荐阅读