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;
});









share|improve this question
















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.



















    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;
    });









    share|improve this question
















    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.

















      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;
      });









      share|improve this question















      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






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      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.
























          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.






          share|improve this answer





















            Your Answer





            StackExchange.ifUsing("editor", function () {
            return StackExchange.using("mathjaxEditing", function () {
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
            });
            });
            }, "mathjax-editing");

            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "196"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            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

























            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.






            share|improve this answer

























              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.






              share|improve this answer























                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.






                share|improve this answer












                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.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Aug 13 at 20:41









                Sᴀᴍ Onᴇᴌᴀ

                8,09961751




                8,09961751






























                    draft saved

                    draft discarded




















































                    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.




                    draft saved


                    draft discarded














                    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





















































                    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







                    Popular posts from this blog

                    Ottavio Pratesi

                    Tricia Helfer

                    15 giugno