2016-12-22 2 views
2

私は少し問題がありますが、それは私をたくさんイライラさせています。1対多の関係を使用するとき、コレクションの最初のアイテムを取得する方法

I持っている二つのテーブル
1.ユーザー
2.ポスト

ユーザー多くの投稿があり、ポストは、1人のユーザーに属することができ

私の質問:最初に取得する方法関係を入力するとポスト?ところで

public function index() { 
$user = User::find(1); 

// here it will return all posts 

$user->with('posts'); 

    return view('home.index',compact('user')); 
} 

:私は、クロージャを使用しますが、それはうまくいきませんでした...それはポスト

public function index() 
    { 

     $user = User::find(1); 


     $user = $user->with(['posts' => function ($query) { 
      $query->first(); 
     }])->get(); 

     return $user ; 
     return view('home.index',compact('user')); 
    } 

を持つすべてのユーザーを返すと、結果はそのようなものです:

[ 
{ 
"id": 1, 
"name": "Barney Walter", 
"email": "[email protected]", 
"created_at": "2016-12-22 10:48:45", 
"updated_at": "2016-12-22 10:48:45", 
"posts": [] 
}, 
{ 
"id": 2, 
"name": "Dr. Makenzie Rutherford", 
"email": "[email protected]", 
"created_at": "2016-12-22 10:48:45", 
"updated_at": "2016-12-22 10:48:45", 
"posts": [] 
}, 
{ 
"id": 3, 
"name": "Ernesto Shanahan", 
"email": "[email protected]", 
"created_at": "2016-12-22 10:48:45", 
"updated_at": "2016-12-22 10:48:45", 
"posts": [] 
}, 
{ 
"id": 4, 
"name": "Rosalinda Cartwright", 
"email": "[email protected]", 
"created_at": "2016-12-22 10:48:45", 
"updated_at": "2016-12-22 10:48:45", 
"posts": [] 
}, 
{ 
"id": 5, 
"name": "Kyleigh Willms", 
"email": "[email protected]", 
"created_at": "2016-12-22 10:48:45", 
"updated_at": "2016-12-22 10:48:45", 
"posts": [ 
{ 
"id": 1, 
"user_id": 5, 
"name": "Malcolm Simonis", 
"title": "Autem quidem quia earum ipsam. A a commodi id adipisci quia minima iste numquam. Eum eius odit porro veniam. Et iure occaecati sapiente minima et beatae. Labore eius labore accusamus sapiente sed eveniet accusamus.", 
"is_published": 1, 
"created_at": "2016-12-22 10:54:14", 
"updated_at": "2016-12-22 10:54:14" 
} 
] 
} 
] 

お手数です...お願いします!

+0

あなたの質問がはっきりしないので、私は何の答えを与えるのかは完全にはわかりません。意図した結果はどうあるべきですか? 1つ以上の投稿を持つことに基づいてユーザーをフィルタリングするか、すべてのユーザーとその最初の投稿のみを表示しますか? – Luceos

+0

Laravel as Much、Logicをベースにしていますが、あなたの投稿結果に対してページネーションやページングクエリを試すことができます。あなたが必要とする投稿をいくつでも得ることができます。 [this](http://stackoverflow.com/questions/21255508/select-the-first-10-rows-laravel-eloquent?answertab=active#tab-top)のようなもの –

+0

はい...表示したい彼の最初の投稿だけ? – hikefd

答えて

0

take()を使用してみてください:

$user = User::with(['posts' => function ($query) { 
      $query->orderBy('created_at', 'asc')->take(1); 
     }])->first(); 

そしてorderBy('created_at', 'asc')あなたは非常に最初の投稿をお願いしますので、結果をソートします。

+0

これはほぼ正しいです。 Userモデルの 'first()'メソッドを 'find($ id)'メソッドに置き換えるだけでいいです。 'with()'クロージャーは私にぴったりです。 –

0

これを試してみると1ポストになります。

$user = User::with('posts')->first(); 
$user->setRelation('posts', $business->posts->take(1)); 
0

あなたがpost代わりのcollectionのモデルobjectをしたいなら、あなたのようにUserモデルに新たなhasOne関係を定義することができます。

public function post() 
{ 
    return $this->hasOne('App\Post'); 
} 

そして、あなたのようにそれを照会することができます

$user = User::where('id', 1)->with('post')->first(); 
は、
関連する問題