2017-11-03 4 views
2

に私がsave()機能を使用する場合しかし、私は次のエラーを取得していますオブジェクトを投稿しようとしています:は、外部キー制約は、((保存使用して失敗した)が、作成に失敗していない)ルーメン

Cannot add or update a child row: a foreign key constraint fails

奇妙であることですsave()の代わりにcreate()を使用すると、失敗しません。あなたはそれがなぜそれのようなものなのか教えてもらえますか?

これは私が何をすべきかです:

$post = new Post(); 
$input = $request->all(); 
$post->save(); 

これは私のPostモデルである:

class Post extends Model{ 

    protected $fillable = [ 
     'creator_id', 'title' 
    ]; 

    public function user(){ 
     return $this->belongsTo(User::class); 
    } 
} 

これは、Userモデルである:

class User extends Model{ 

    protected $fillable = [ 
     'first_name', 'last_name', 'email', 'profile_image_url' 
    ]; 

    protected $hidden = [ 
     'password', 
    ]; 
} 

私はUsersテーブルや記事テーブルを持っています。そして、関係は投稿テーブルでposts.creator_idusers.idです。

refular SQLクエリでもデータが正しく挿入されることにも言及したいと思います。これにより

+0

ユーザーモデルと投稿モデルの両方を投稿できますか?問題は、あなたが別名で別名を付けてあなたのFKを投稿したことかもしれません。 – idelara

+0

また、マイグレーションとEloquentリレーションシップを使用していますか? – idelara

+0

@JackGal私のエイリアスを確認しましたが、すべて同じ名前です。そして、はい、私はEloquentの関係を使用しています。 –

答えて

1

を、あなたが不足していますUserモデルのEloquent関係の定義また、混乱を避けるためにクラスのプロパティprotected $tableを宣言することは良い習慣であり、Eloquentが動作させるテーブルでEloquentが動作することを確認することは良い習慣です。あなたのUserPostクラスに関しては

、彼らのように定義する必要があります。

さらに
class User extends Model{ 

    // protected $table = 'name_of_users_table'; 
    protected $fillable = [ 
     'first_name', 'last_name', 'email', 'profile_image_url' 
    ]; 

    protected $hidden = [ 
     'password', 
    ]; 

    public function posts() 
    { 
     return $this->hasMany(Post::class); 
    } 
} 

class Post extends Model{ 

    // protected $table = 'name_of_posts_table'; 
    protected $fillable = [ 
     'creator_id', 'title' 
    ]; 

    public function user(){ 
     // You need to explicitly set the 'foreign_id' to 'creator_id' 
     return $this->belongsTo(User::class, 'creator_id'); 
    } 
} 

、あなたはあなたのpostsテーブル内creator_id列を持っていることを確認する必要があります。

さらに詳しいヘルプが必要な場合は、Laravel's docsを確認して、1対多関係のセクションに注意してください。

こちらがお役に立てば幸いです。

乾杯!

EDIT 1:OPのアプローチが動作しない理由を説明する

基本的には、あなたの元の質問ごとに、あなたが持っている:

$post = new Post(); 
$input = $request->all(); 
$post->save(); 

この時点で、あなたは$postオブジェクトには何も割り当てていないため、実行されるたびに$post->save()、あなたのオブジェクトは、のように、空でありますEloquentがフードの下でそれに割り当てるもののほかに、それに割り当てられたプロパティはありません。

Cannot add or update a child row: a foreign key constraint fails

は、次のようにコードを修正することができ、それが動作します、それを取り除くために:あなたは、制約(雄弁な関係を)持っていますが、あなたのオブジェクトが空であるので、エラーが発生します

このようにして、FK制約を満たすPostモデルのインスタンスを保存しています。

私はこの説明があなたの理解に役立つことを願っています。

+0

投稿テーブルに' creator_id'があることを二重チェックしました。私はPostモデルに欠けている関係を加えましたが、結果はまったく同じです。 '$ post-> creator_id = $ request-> creator_id;'と '$ post-> save();'を使って動作させました。 –

+0

ファクトリメソッドを試してみませんか? '$ input = $ request-> all();'である 'Post :: create($ input)'を実行してください... – idelara

+0

なぜ私は1つしか動作しないのか、もう1つは動作しないのでしょうか? –

1

、私は「あなたは私はあなたがドンあなたのモデル内で上記の見ることができるようにあなたが$post->column_name = 'column_value'

$input = $request->all(); 
$post = new Post(); 

foreach($input as $key => $value){ 
    // Doing like $post->title = 'My Post Title' 
    $post->$key = $value; 
} 

// If the creator_id is not in the form 
if(empty($input['creator_id'])){ 
    $post->creator_id = $user_id; // Or use Auth::user()->getId(); 
} 

$post->save(); 
1

としてそれを行う必要があり、そのような<input name="fields[]">

ご入力フォームで任意のarrayを持っていない期待問題があります。

あなたはその後dd($request->all());

であなたの$request->all();の内側にあるものを私に示すことができるならば、あなたの$request->all()users.id

を持っているかどうかを確認し、この変更:これが機能しない場合

$post = new Post(); 
$post = $request->all(); 
$post->save(); 

をあなたはこれを試してください:

私は考えますsaveメトあなたが$request->all()の中にusers.id paramを持っておらず、新しい行を作成するためにposts.creator_idが必要であるため、dが機能しません。そのため、あなたが牽引ソリューションを持っている:まず、あなたはcreateメソッドを使用するか、save方法とがありますが、このような何かする必要があることを行うことができます:上記のあなたの質問のコメントで述べたように

$post = new Post(); 
post->name_of_col_1 = $request->get('name_of_col_1'); 
$post->creator_id = $request->get('creator_id'); 
+0

あなたはいくつかをクリアしました。私の '$ request-> all()'にはusers.idではなくcreator_idが含まれています。 2番目のソリューションが機能します。しかし、それも最初の仕事をすることは可能ですか? –

+0

このようにcreateメソッドを使う必要があります: '$ input = $ request-> all(); Post :: create($ input); ' –

関連する問題