2016-09-16 4 views
3

後の関係を取得し、私はデータベースに新しい行を挿入します。私のPost.php私のコードでは、インサート

$post = new Post; 
$post->user_id = Auth::user()->id; 
// more inserts 
$post->save(); 

を、私が持っている:

protected $with = [ 
    'user', 'answers', 'questions' 
]; 

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

// etc 

しかし、私は挿入した後、私は$postを返し、それには関係(usersanswersquestions)は付いていません。

挿入後にデフォルトのリレーションシップをすべてロードするにはどうすればよいですか?

+0

関係が結ばれていないということを意味しますか?あなたはどのように関係にアクセスしていますか? – Devon

+0

'print_r(User :: where(['id' => Auth :: user() - > id]) - >( 'posts')); ' –

答えて

4

save()方法は、データベースにデータを持続するが、それはモデルにデータを更新するか、関係を再ロードについては何も行いません。

最も簡単な解決策は、save()を呼び出した後でオブジェクトを更新することです。これは自動的に熱心なあなたがモデルにあなたの$withプロパティで定義した関係をロードします:別のオプションは、単に手動load()方法を使用して、関係を自分でリロードすることです

// ... 
$post->save(); 

// refresh the post from the database 
$post = $post->fresh(); 

// ... 
$post->save(); 

// reload the desired relationships 
$post->load(['user', 'answers', 'questions']); 

しかし、これはあなたが自動ロード(一度、このコードでは、その後一度モデルで定義された、と)になりたいの関係を定義するコードを複製します。モデルに新しい関数を作成することでそれを緩和することができます。

// in Post model 
public function reloadRelations() { 
    $this->load($this->with); 
} 

// code usage 

// ... 
$post->save(); 

// call your new function to reload the relations 
$post->reloadRelations(); 

しかし、ちょうどfresh()方法で構築を呼び出す上でこのルートを行くことの唯一の真のメリットは、これが元Postデータを取得するクエリを再実行しないであろうということです。

リクエストを1000秒間処理する場合は、1つのクエリで違いが生じる可能性がありますが、それ以外は心配しないで、fresh()メソッドを使用してください。しかし、オプションはあなたが選択するためのものです。

-1

は、モデルPost.phpであってもよい:

protected $primaryKey = 'id';  

public function users() 
{ 
    return $this->hasOne('App\User', 'id', 'user_id'); 
} 

前: 移行 "記事"

Schema::create('articles', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->integer('user_id')->unsigned(); 
      $table->foreign('user_id')->references('id')->on('users'); 
      // ..... 

     }); 

うまくいけば、これが解決する問題

+0

これは私の問題を解決しませんでした。 – user6828106

1

代わりに手動で属性を設定しますuser_idの場合は、\Illuminate\Database\Eloquent\Relations\BelongsToクラスの関連メソッドを使用する必要があります。

$post->user()->associate(Auth::user()); 

// now you have the user inside your post. 
dd($post->user); 
関連する問題