2017-07-14 14 views
0

私は雄弁な関係からデータを使用しようとする際に問題があります。私は私のポストモデルで関係を定義しました。laravelの雄弁な関係を使用しているエラー

class post extends Model 
{ 
    // 
    protected $fillable = ['title', 'contents', 'user_id', 'status']; 

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

} 

私はそうのように私のコントローラから、この関係にアクセスしようとしています:

public function showBlog(){ 
     $post = post ::where('status', 1) 
      ->users() 
      ->orderBy('id', 'desc') 
      ->paginate(3); 
    return view ('blog') 
      ->with('posts', $post); 
    } 

しかし、このエラーが取得しています:未定義のメソッドを照らし\ Databaseへ コール\クエリー\ビルダー::ユーザーを()

どうすれば解決できますか?私はlaravelを使用しています5.3

答えて

0

リレーションシップはモデルの動作であり、取得しているのはクエリを作成しているときのクエリビルダーインスタンスです。フレームワークは依然としてクエリを構築しており、成果やモデルについては明確ではなく、関係を構築するために必要なモデルから正確に得られます。

リレーションにアクセスする前に、まずモデルPostのインスタンスを生成する必要があります。

post ::where('status', 1)->first() 
      ->users() 
      ->orderBy('id', 'desc') 
      ->paginate(3); 

ここで最初のクエリの残りの部分は、このモデルのインスタンス上で実行されます、その後Postのクエリpost ::where('status', 1)を実行し、あなたのための最初の結果のモデルを取得しますfirst()方法:

は次のように試してみてください。

ただし、このクエリは結果の最初の投稿のユーザーのみになります。あなたが取得したい場合は、ユーザーの関係を持つすべての記事は次のようにwithを使用してみてください:

post::where('status', 1)->with('users') 
      ->orderBy('id', 'desc') 
      ->paginate(3); 

これは彼らのユーザーを持つ投稿のためのページ付けの結果になります。

希望すると助かります。

+0

ありがとうございました!私は、ユーザーモデルからビューの '名前'列にアクセスしようとしています。私はこの @foreach($ $ポストとしてポストを)やった {{$ポスト>名}}ユーザーのプロパティは、あなたがのようにアクセスする必要があり、その場合は @endforeach – radioactive

+0

'$ポスト> users->投稿時に1人のユーザーがいる場合は「名前」です。そして、より良い使用法を定義するので、 'users'の代わりに' user'と名付けるべきです。 –

+0

うわー!ありがとう@parantap – radioactive

関連する問題