Retrive relation on a polymorphic model
up vote
0
down vote
favorite
I have a Game model that is "static". Containing game information and such, and users can comment on all games.
Games model
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
And then I have a Comment model. This has a User relation and a Comments relation.
public function commentable()
{
return $this->morphTo();
}
public function user()
{
return $this->belongsTo(User::class);
}
What I want to do is to fetch the 10 games sorted by the latest comment top, be able to display who made the comment, and when.
I have this query that seems to do the job, but it makes an absurd amount of queries. Can I somehow keep the queries to a minimum?
$games = Game::join('comments', 'games.id', '=', 'comments.commentable_id')
->where('comments.commentable_type', Game::class)
->latest('comments.created_at')
->groupBy('games.id')
->take(10)
->withCount('comments')
->get()->each(function($games){
$games->comment = $games->comments()->orderBy('created_at', 'desc')->first();
$games->user = User::find($games->comment->user_id);
return $games;
});
php laravel eloquent
bumped to the homepage by Community♦ 1 hour ago
This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.
add a comment |
up vote
0
down vote
favorite
I have a Game model that is "static". Containing game information and such, and users can comment on all games.
Games model
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
And then I have a Comment model. This has a User relation and a Comments relation.
public function commentable()
{
return $this->morphTo();
}
public function user()
{
return $this->belongsTo(User::class);
}
What I want to do is to fetch the 10 games sorted by the latest comment top, be able to display who made the comment, and when.
I have this query that seems to do the job, but it makes an absurd amount of queries. Can I somehow keep the queries to a minimum?
$games = Game::join('comments', 'games.id', '=', 'comments.commentable_id')
->where('comments.commentable_type', Game::class)
->latest('comments.created_at')
->groupBy('games.id')
->take(10)
->withCount('comments')
->get()->each(function($games){
$games->comment = $games->comments()->orderBy('created_at', 'desc')->first();
$games->user = User::find($games->comment->user_id);
return $games;
});
php laravel eloquent
bumped to the homepage by Community♦ 1 hour ago
This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I have a Game model that is "static". Containing game information and such, and users can comment on all games.
Games model
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
And then I have a Comment model. This has a User relation and a Comments relation.
public function commentable()
{
return $this->morphTo();
}
public function user()
{
return $this->belongsTo(User::class);
}
What I want to do is to fetch the 10 games sorted by the latest comment top, be able to display who made the comment, and when.
I have this query that seems to do the job, but it makes an absurd amount of queries. Can I somehow keep the queries to a minimum?
$games = Game::join('comments', 'games.id', '=', 'comments.commentable_id')
->where('comments.commentable_type', Game::class)
->latest('comments.created_at')
->groupBy('games.id')
->take(10)
->withCount('comments')
->get()->each(function($games){
$games->comment = $games->comments()->orderBy('created_at', 'desc')->first();
$games->user = User::find($games->comment->user_id);
return $games;
});
php laravel eloquent
I have a Game model that is "static". Containing game information and such, and users can comment on all games.
Games model
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
And then I have a Comment model. This has a User relation and a Comments relation.
public function commentable()
{
return $this->morphTo();
}
public function user()
{
return $this->belongsTo(User::class);
}
What I want to do is to fetch the 10 games sorted by the latest comment top, be able to display who made the comment, and when.
I have this query that seems to do the job, but it makes an absurd amount of queries. Can I somehow keep the queries to a minimum?
$games = Game::join('comments', 'games.id', '=', 'comments.commentable_id')
->where('comments.commentable_type', Game::class)
->latest('comments.created_at')
->groupBy('games.id')
->take(10)
->withCount('comments')
->get()->each(function($games){
$games->comment = $games->comments()->orderBy('created_at', 'desc')->first();
$games->user = User::find($games->comment->user_id);
return $games;
});
php laravel eloquent
php laravel eloquent
edited Aug 13 at 20:17
Sᴀᴍ Onᴇᴌᴀ
8,09961751
8,09961751
asked Aug 13 at 18:31
Adam
1435
1435
bumped to the homepage by Community♦ 1 hour ago
This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.
bumped to the homepage by Community♦ 1 hour ago
This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
You didn't specify which version of Laravel is used, so I am going to presume it is 5.x. If that is incorrect, please notify me and update your post with such relevant information
I am not sure exactly how to reduce the queries for comments but the suggestion below should allow for the simplification of the queries for the user.
Eager Loading
(Nested) Eager Loading - utilizing the with() method - can be used to populate the user property for each item in the collection:
$games = Game::join('comments', 'games.id', '=', 'comments.commentable_id')
->where('comments.commentable_type', Game::class)
->latest('comments.created_at')
->groupBy('games.id')
->take(10)
->with('comment.user')
->withCount('comments')
Variable naming
The lambda/closure passed to each() accepts a parameter named $games. Isn't it actually a representation of a game? If so, $game would be more appropriate. Additionally, other developers reading the code may be confused because $games is also used for the assignment of the collection.
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
You didn't specify which version of Laravel is used, so I am going to presume it is 5.x. If that is incorrect, please notify me and update your post with such relevant information
I am not sure exactly how to reduce the queries for comments but the suggestion below should allow for the simplification of the queries for the user.
Eager Loading
(Nested) Eager Loading - utilizing the with() method - can be used to populate the user property for each item in the collection:
$games = Game::join('comments', 'games.id', '=', 'comments.commentable_id')
->where('comments.commentable_type', Game::class)
->latest('comments.created_at')
->groupBy('games.id')
->take(10)
->with('comment.user')
->withCount('comments')
Variable naming
The lambda/closure passed to each() accepts a parameter named $games. Isn't it actually a representation of a game? If so, $game would be more appropriate. Additionally, other developers reading the code may be confused because $games is also used for the assignment of the collection.
add a comment |
up vote
0
down vote
You didn't specify which version of Laravel is used, so I am going to presume it is 5.x. If that is incorrect, please notify me and update your post with such relevant information
I am not sure exactly how to reduce the queries for comments but the suggestion below should allow for the simplification of the queries for the user.
Eager Loading
(Nested) Eager Loading - utilizing the with() method - can be used to populate the user property for each item in the collection:
$games = Game::join('comments', 'games.id', '=', 'comments.commentable_id')
->where('comments.commentable_type', Game::class)
->latest('comments.created_at')
->groupBy('games.id')
->take(10)
->with('comment.user')
->withCount('comments')
Variable naming
The lambda/closure passed to each() accepts a parameter named $games. Isn't it actually a representation of a game? If so, $game would be more appropriate. Additionally, other developers reading the code may be confused because $games is also used for the assignment of the collection.
add a comment |
up vote
0
down vote
up vote
0
down vote
You didn't specify which version of Laravel is used, so I am going to presume it is 5.x. If that is incorrect, please notify me and update your post with such relevant information
I am not sure exactly how to reduce the queries for comments but the suggestion below should allow for the simplification of the queries for the user.
Eager Loading
(Nested) Eager Loading - utilizing the with() method - can be used to populate the user property for each item in the collection:
$games = Game::join('comments', 'games.id', '=', 'comments.commentable_id')
->where('comments.commentable_type', Game::class)
->latest('comments.created_at')
->groupBy('games.id')
->take(10)
->with('comment.user')
->withCount('comments')
Variable naming
The lambda/closure passed to each() accepts a parameter named $games. Isn't it actually a representation of a game? If so, $game would be more appropriate. Additionally, other developers reading the code may be confused because $games is also used for the assignment of the collection.
You didn't specify which version of Laravel is used, so I am going to presume it is 5.x. If that is incorrect, please notify me and update your post with such relevant information
I am not sure exactly how to reduce the queries for comments but the suggestion below should allow for the simplification of the queries for the user.
Eager Loading
(Nested) Eager Loading - utilizing the with() method - can be used to populate the user property for each item in the collection:
$games = Game::join('comments', 'games.id', '=', 'comments.commentable_id')
->where('comments.commentable_type', Game::class)
->latest('comments.created_at')
->groupBy('games.id')
->take(10)
->with('comment.user')
->withCount('comments')
Variable naming
The lambda/closure passed to each() accepts a parameter named $games. Isn't it actually a representation of a game? If so, $game would be more appropriate. Additionally, other developers reading the code may be confused because $games is also used for the assignment of the collection.
answered Aug 13 at 20:41
Sᴀᴍ Onᴇᴌᴀ
8,09961751
8,09961751
add a comment |
add a comment |
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f201598%2fretrive-relation-on-a-polymorphic-model%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown