GroupBy on Eloquent relationship











up vote
0
down vote

favorite












I am trying to combine 4 models to get a summary report. These are my tables.



user
-id
-name
-country_id

country
-id
-name

invoice
-id
-user_id
-type_id

type
-id
-name


I want to count a detail of invoice for each type based on the country. That is something like this.



country | type_name_1 | type_name_2 | type_name_2
America | 10 | 2 | 4
Canada | 62 | 0 | 35
China | 23 | 9 | 5


I tried the following query but it's not exactly giving the answer I want above.



AppInvoice::all()->groupBy(function($s){
return $s->user->country->name;
})->groupBy(function($s){
return $s->type->count();
})



Error: Exception with message 'Property [type] does not exist on this
collection instance.'




Can someone give me a pointer here?










share|improve this question






















  • you can use Polymorphic Relations to simplify . it is easily managable. See laravel.com/docs/5.7/…
    – Nirali
    Nov 19 at 5:33










  • You will need to use joins instead of the relation itself , the result will be a query result instead of the eloquent collection. So for this result , the query builder is the one to go. What you want is quite hard actually because you want the results from one table to become columns, it would be easier if you had the working RAW SQL stackoverflow.com/questions/1241178/mysql-rows-to-columns i think this will help you
    – Munteanu Petrisor
    Nov 19 at 6:53












  • There is no easy nor pretty solution, you might need to look into selectRaw(), joins from query builder, unless you know them already
    – Munteanu Petrisor
    Nov 19 at 7:03















up vote
0
down vote

favorite












I am trying to combine 4 models to get a summary report. These are my tables.



user
-id
-name
-country_id

country
-id
-name

invoice
-id
-user_id
-type_id

type
-id
-name


I want to count a detail of invoice for each type based on the country. That is something like this.



country | type_name_1 | type_name_2 | type_name_2
America | 10 | 2 | 4
Canada | 62 | 0 | 35
China | 23 | 9 | 5


I tried the following query but it's not exactly giving the answer I want above.



AppInvoice::all()->groupBy(function($s){
return $s->user->country->name;
})->groupBy(function($s){
return $s->type->count();
})



Error: Exception with message 'Property [type] does not exist on this
collection instance.'




Can someone give me a pointer here?










share|improve this question






















  • you can use Polymorphic Relations to simplify . it is easily managable. See laravel.com/docs/5.7/…
    – Nirali
    Nov 19 at 5:33










  • You will need to use joins instead of the relation itself , the result will be a query result instead of the eloquent collection. So for this result , the query builder is the one to go. What you want is quite hard actually because you want the results from one table to become columns, it would be easier if you had the working RAW SQL stackoverflow.com/questions/1241178/mysql-rows-to-columns i think this will help you
    – Munteanu Petrisor
    Nov 19 at 6:53












  • There is no easy nor pretty solution, you might need to look into selectRaw(), joins from query builder, unless you know them already
    – Munteanu Petrisor
    Nov 19 at 7:03













up vote
0
down vote

favorite









up vote
0
down vote

favorite











I am trying to combine 4 models to get a summary report. These are my tables.



user
-id
-name
-country_id

country
-id
-name

invoice
-id
-user_id
-type_id

type
-id
-name


I want to count a detail of invoice for each type based on the country. That is something like this.



country | type_name_1 | type_name_2 | type_name_2
America | 10 | 2 | 4
Canada | 62 | 0 | 35
China | 23 | 9 | 5


I tried the following query but it's not exactly giving the answer I want above.



AppInvoice::all()->groupBy(function($s){
return $s->user->country->name;
})->groupBy(function($s){
return $s->type->count();
})



Error: Exception with message 'Property [type] does not exist on this
collection instance.'




Can someone give me a pointer here?










share|improve this question













I am trying to combine 4 models to get a summary report. These are my tables.



user
-id
-name
-country_id

country
-id
-name

invoice
-id
-user_id
-type_id

type
-id
-name


I want to count a detail of invoice for each type based on the country. That is something like this.



country | type_name_1 | type_name_2 | type_name_2
America | 10 | 2 | 4
Canada | 62 | 0 | 35
China | 23 | 9 | 5


I tried the following query but it's not exactly giving the answer I want above.



AppInvoice::all()->groupBy(function($s){
return $s->user->country->name;
})->groupBy(function($s){
return $s->type->count();
})



Error: Exception with message 'Property [type] does not exist on this
collection instance.'




Can someone give me a pointer here?







laravel eloquent






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 19 at 5:12









Fawzan

2,77432353




2,77432353












  • you can use Polymorphic Relations to simplify . it is easily managable. See laravel.com/docs/5.7/…
    – Nirali
    Nov 19 at 5:33










  • You will need to use joins instead of the relation itself , the result will be a query result instead of the eloquent collection. So for this result , the query builder is the one to go. What you want is quite hard actually because you want the results from one table to become columns, it would be easier if you had the working RAW SQL stackoverflow.com/questions/1241178/mysql-rows-to-columns i think this will help you
    – Munteanu Petrisor
    Nov 19 at 6:53












  • There is no easy nor pretty solution, you might need to look into selectRaw(), joins from query builder, unless you know them already
    – Munteanu Petrisor
    Nov 19 at 7:03


















  • you can use Polymorphic Relations to simplify . it is easily managable. See laravel.com/docs/5.7/…
    – Nirali
    Nov 19 at 5:33










  • You will need to use joins instead of the relation itself , the result will be a query result instead of the eloquent collection. So for this result , the query builder is the one to go. What you want is quite hard actually because you want the results from one table to become columns, it would be easier if you had the working RAW SQL stackoverflow.com/questions/1241178/mysql-rows-to-columns i think this will help you
    – Munteanu Petrisor
    Nov 19 at 6:53












  • There is no easy nor pretty solution, you might need to look into selectRaw(), joins from query builder, unless you know them already
    – Munteanu Petrisor
    Nov 19 at 7:03
















you can use Polymorphic Relations to simplify . it is easily managable. See laravel.com/docs/5.7/…
– Nirali
Nov 19 at 5:33




you can use Polymorphic Relations to simplify . it is easily managable. See laravel.com/docs/5.7/…
– Nirali
Nov 19 at 5:33












You will need to use joins instead of the relation itself , the result will be a query result instead of the eloquent collection. So for this result , the query builder is the one to go. What you want is quite hard actually because you want the results from one table to become columns, it would be easier if you had the working RAW SQL stackoverflow.com/questions/1241178/mysql-rows-to-columns i think this will help you
– Munteanu Petrisor
Nov 19 at 6:53






You will need to use joins instead of the relation itself , the result will be a query result instead of the eloquent collection. So for this result , the query builder is the one to go. What you want is quite hard actually because you want the results from one table to become columns, it would be easier if you had the working RAW SQL stackoverflow.com/questions/1241178/mysql-rows-to-columns i think this will help you
– Munteanu Petrisor
Nov 19 at 6:53














There is no easy nor pretty solution, you might need to look into selectRaw(), joins from query builder, unless you know them already
– Munteanu Petrisor
Nov 19 at 7:03




There is no easy nor pretty solution, you might need to look into selectRaw(), joins from query builder, unless you know them already
– Munteanu Petrisor
Nov 19 at 7:03












2 Answers
2






active

oldest

votes

















up vote
0
down vote













Your query will get only results of Invoice model. To get the related table use with.



AppInvoice::with('type','user')->get();


This will result collection of invoices with related types and user. Then you can use the groupBy method to filter the result collection. To know more about groupBy method, see the link.






share|improve this answer




























    up vote
    0
    down vote













    You have to query country model like



        Country::withCount(['invoice' => function($q){
    $q->groupBy('type_id');
    ->get();





    share|improve this answer





















      Your Answer






      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: "1"
      };
      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: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      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%2fstackoverflow.com%2fquestions%2f53368663%2fgroupby-on-eloquent-relationship%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes








      up vote
      0
      down vote













      Your query will get only results of Invoice model. To get the related table use with.



      AppInvoice::with('type','user')->get();


      This will result collection of invoices with related types and user. Then you can use the groupBy method to filter the result collection. To know more about groupBy method, see the link.






      share|improve this answer

























        up vote
        0
        down vote













        Your query will get only results of Invoice model. To get the related table use with.



        AppInvoice::with('type','user')->get();


        This will result collection of invoices with related types and user. Then you can use the groupBy method to filter the result collection. To know more about groupBy method, see the link.






        share|improve this answer























          up vote
          0
          down vote










          up vote
          0
          down vote









          Your query will get only results of Invoice model. To get the related table use with.



          AppInvoice::with('type','user')->get();


          This will result collection of invoices with related types and user. Then you can use the groupBy method to filter the result collection. To know more about groupBy method, see the link.






          share|improve this answer












          Your query will get only results of Invoice model. To get the related table use with.



          AppInvoice::with('type','user')->get();


          This will result collection of invoices with related types and user. Then you can use the groupBy method to filter the result collection. To know more about groupBy method, see the link.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 19 at 5:21









          InvincibleElf

          865




          865
























              up vote
              0
              down vote













              You have to query country model like



                  Country::withCount(['invoice' => function($q){
              $q->groupBy('type_id');
              ->get();





              share|improve this answer

























                up vote
                0
                down vote













                You have to query country model like



                    Country::withCount(['invoice' => function($q){
                $q->groupBy('type_id');
                ->get();





                share|improve this answer























                  up vote
                  0
                  down vote










                  up vote
                  0
                  down vote









                  You have to query country model like



                      Country::withCount(['invoice' => function($q){
                  $q->groupBy('type_id');
                  ->get();





                  share|improve this answer












                  You have to query country model like



                      Country::withCount(['invoice' => function($q){
                  $q->groupBy('type_id');
                  ->get();






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 19 at 7:09









                  Usman Jdn

                  437113




                  437113






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • 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.





                      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%2fstackoverflow.com%2fquestions%2f53368663%2fgroupby-on-eloquent-relationship%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

                      "Incorrect syntax near the keyword 'ON'. (on update cascade, on delete cascade,)

                      Alcedinidae

                      Origin of the phrase “under your belt”?