Laravel 5.4交易和一对多关系

时间:2018-06-15 08:06:24

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

  

开始交易   select * from batiments其中(nom ='HI')限制1   回滚交易

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

  

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

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

感谢

2 个答案:

答案 0 :(得分:0)

category_id

您将此字段设置为索引,只需删除index()即可。标识字段必须只包含唯一记录,但您的"nativescript-dev-webpack": "^0.13.0",可能会多次使用相同的值。

答案 1 :(得分:0)

代码:

$table->integer('categorie_id')->unsigned(); 

$table->foreign('categorie_id')->references('id')->on('categories');

Laravel支持创建外键约束,这些约束用于强制数据库级别的引用完整性。例如,让我们在articles表上定义一个categoriesie_id列,该列引用类别表上的id列  laravel.com/docs/5.4/migrations#foreign-key-constraints