Not an expert but try
->find(1)->get() /*instead of take()*/
or simply
->first() /* without ->get() following*/
http://laravel.com/docs/5.1/eloquent#retrieving-single-models
I have a Post Model that have a hasMany relation to post_pics and belongsToMany relation to Category Model.
I want to fetch All Posts and All their Categories but First post_pics of each Post.
For that I write this Eager Load Constraints :
Post::with([
'post_pics' => function ($query) {
$query->select(['pic_id', 'pic_name', 'post_id'])->first()->get();
},
'categories' => function ($query) {
$query->select(['categories.cat_id', 'name']);
}
])
->take(12)->orderBy('created_at', 'desc')
->get(['post_id', 'post_title', 'post_alias', 'post_content', 'comments_count', 'created_at']);
return $latestPosts;
When I remove first() method after select() method all things works and returns all pictures of each Post but when I use first() method, only returns first picture of Models that have more than one picture.
I try to take(1) Constraints but it does not work too.
What is Problem and How Can I do that?
You must not use first or get in a eager loading constraint. It is just made for adding clauses to the relationship.
If you want to eager load the first pic of each post you should create a new relationship in post model :
public function first_post_pic ()
{
return $this->hasOne(PostPicture::class)->orderBy('id', 'asc'); // Order it by anything you want
}
Then you can eager load it :
$posts = Post::with('first_post_pic', 'categories')->take(12)->latest() // latest == created_at desc
Also I see you select only some columns. Be careful you have to select all the keys of the relationships in order to make eager loading work.
If you do this for formatting the output you should use something like the fractal package instead of filtering the columns you select.
Please or to participate in this conversation.