Laravel: Iterate through join collection










0















I have a laravel DB collection which retrieves data using joins. As this:



public static function getAllClientData()

return DB::table('clients')
->join('accounts', 'clients.id', '=', 'accounts.client_id')
->join('addresses', 'clients.address_id', '=', 'addresses.id')
->select('clients.*', 'accounts.*', 'addresses.*')
->get();



Now I want to get the values of the returned DB collection. However, the table accounts and clients contain both the column "comment". This column is not the same column and contains different values. How can I iterate through the returned DB collection and access/get the value of the specified column?



I have already tried this so far:



foreach($data as $item)
echo $item->addresses.comment;
echo $item->accounts.comment;



However, it is not working. How can I tell Laravel to get the value of the column comment from the table addresses and also next from the table accounts?










share|improve this question



















  • 1





    Try dumping the data to find out how the data is retrieved in php. dd($data);

    – Jerodev
    Jun 30 '18 at 11:07







  • 1





    Can't you set up Eloquent relationships?! You are using Laravel and not using its most powerful feature Eloquent ORM.

    – Kyslik
    Jun 30 '18 at 11:39
















0















I have a laravel DB collection which retrieves data using joins. As this:



public static function getAllClientData()

return DB::table('clients')
->join('accounts', 'clients.id', '=', 'accounts.client_id')
->join('addresses', 'clients.address_id', '=', 'addresses.id')
->select('clients.*', 'accounts.*', 'addresses.*')
->get();



Now I want to get the values of the returned DB collection. However, the table accounts and clients contain both the column "comment". This column is not the same column and contains different values. How can I iterate through the returned DB collection and access/get the value of the specified column?



I have already tried this so far:



foreach($data as $item)
echo $item->addresses.comment;
echo $item->accounts.comment;



However, it is not working. How can I tell Laravel to get the value of the column comment from the table addresses and also next from the table accounts?










share|improve this question



















  • 1





    Try dumping the data to find out how the data is retrieved in php. dd($data);

    – Jerodev
    Jun 30 '18 at 11:07







  • 1





    Can't you set up Eloquent relationships?! You are using Laravel and not using its most powerful feature Eloquent ORM.

    – Kyslik
    Jun 30 '18 at 11:39














0












0








0








I have a laravel DB collection which retrieves data using joins. As this:



public static function getAllClientData()

return DB::table('clients')
->join('accounts', 'clients.id', '=', 'accounts.client_id')
->join('addresses', 'clients.address_id', '=', 'addresses.id')
->select('clients.*', 'accounts.*', 'addresses.*')
->get();



Now I want to get the values of the returned DB collection. However, the table accounts and clients contain both the column "comment". This column is not the same column and contains different values. How can I iterate through the returned DB collection and access/get the value of the specified column?



I have already tried this so far:



foreach($data as $item)
echo $item->addresses.comment;
echo $item->accounts.comment;



However, it is not working. How can I tell Laravel to get the value of the column comment from the table addresses and also next from the table accounts?










share|improve this question
















I have a laravel DB collection which retrieves data using joins. As this:



public static function getAllClientData()

return DB::table('clients')
->join('accounts', 'clients.id', '=', 'accounts.client_id')
->join('addresses', 'clients.address_id', '=', 'addresses.id')
->select('clients.*', 'accounts.*', 'addresses.*')
->get();



Now I want to get the values of the returned DB collection. However, the table accounts and clients contain both the column "comment". This column is not the same column and contains different values. How can I iterate through the returned DB collection and access/get the value of the specified column?



I have already tried this so far:



foreach($data as $item)
echo $item->addresses.comment;
echo $item->accounts.comment;



However, it is not working. How can I tell Laravel to get the value of the column comment from the table addresses and also next from the table accounts?







mysql laravel join eloquent iteration






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Feb 4 at 22:13









marc_s

578k12911161261




578k12911161261










asked Jun 30 '18 at 10:56









JanJan

1478




1478







  • 1





    Try dumping the data to find out how the data is retrieved in php. dd($data);

    – Jerodev
    Jun 30 '18 at 11:07







  • 1





    Can't you set up Eloquent relationships?! You are using Laravel and not using its most powerful feature Eloquent ORM.

    – Kyslik
    Jun 30 '18 at 11:39













  • 1





    Try dumping the data to find out how the data is retrieved in php. dd($data);

    – Jerodev
    Jun 30 '18 at 11:07







  • 1





    Can't you set up Eloquent relationships?! You are using Laravel and not using its most powerful feature Eloquent ORM.

    – Kyslik
    Jun 30 '18 at 11:39








1




1





Try dumping the data to find out how the data is retrieved in php. dd($data);

– Jerodev
Jun 30 '18 at 11:07






Try dumping the data to find out how the data is retrieved in php. dd($data);

– Jerodev
Jun 30 '18 at 11:07





1




1





Can't you set up Eloquent relationships?! You are using Laravel and not using its most powerful feature Eloquent ORM.

– Kyslik
Jun 30 '18 at 11:39






Can't you set up Eloquent relationships?! You are using Laravel and not using its most powerful feature Eloquent ORM.

– Kyslik
Jun 30 '18 at 11:39













1 Answer
1






active

oldest

votes


















0














You could use eloquent way with eager load your relations



$clients = Client::with(['accounts','addresses'])->get();


When you loop through $clients on each iteration you will have a collection for related addresses and accounts for each client



class Client extends Model

public function accounts()
return $this->hasMany('AppAccounts','client_id');





Also your relation with addresses looks suspicious if a client has one address then its ok to have an address id in clients table, If a client has multiple addresses then addresses table should have a client_id as foreign key,



If client has one address



public function address()

return $this->belongsTo('AppAddress', 'address_id');



If client has more than one address



public function addresses()
return $this->hasMany('AppAddress','client_id');



For you original query you need to assign them unique alias if 2 tables have same name for columns



DB::table('clients')
->join('accounts', 'clients.id', '=', 'accounts.client_id')
->join('addresses', 'clients.address_id', '=', 'addresses.id')
->select('clients.*', 'accounts.*', 'addresses.*', DB::raw('accounts.comments as account_comments'),DB::raw('addresses.comments as address_comments'))
->get();


Also its not a good idea to select all the columns from a joined query, select only columns that you really need






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',
    autoActivateHeartbeat: false,
    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%2f51114239%2flaravel-iterate-through-join-collection%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









    0














    You could use eloquent way with eager load your relations



    $clients = Client::with(['accounts','addresses'])->get();


    When you loop through $clients on each iteration you will have a collection for related addresses and accounts for each client



    class Client extends Model

    public function accounts()
    return $this->hasMany('AppAccounts','client_id');





    Also your relation with addresses looks suspicious if a client has one address then its ok to have an address id in clients table, If a client has multiple addresses then addresses table should have a client_id as foreign key,



    If client has one address



    public function address()

    return $this->belongsTo('AppAddress', 'address_id');



    If client has more than one address



    public function addresses()
    return $this->hasMany('AppAddress','client_id');



    For you original query you need to assign them unique alias if 2 tables have same name for columns



    DB::table('clients')
    ->join('accounts', 'clients.id', '=', 'accounts.client_id')
    ->join('addresses', 'clients.address_id', '=', 'addresses.id')
    ->select('clients.*', 'accounts.*', 'addresses.*', DB::raw('accounts.comments as account_comments'),DB::raw('addresses.comments as address_comments'))
    ->get();


    Also its not a good idea to select all the columns from a joined query, select only columns that you really need






    share|improve this answer



























      0














      You could use eloquent way with eager load your relations



      $clients = Client::with(['accounts','addresses'])->get();


      When you loop through $clients on each iteration you will have a collection for related addresses and accounts for each client



      class Client extends Model

      public function accounts()
      return $this->hasMany('AppAccounts','client_id');





      Also your relation with addresses looks suspicious if a client has one address then its ok to have an address id in clients table, If a client has multiple addresses then addresses table should have a client_id as foreign key,



      If client has one address



      public function address()

      return $this->belongsTo('AppAddress', 'address_id');



      If client has more than one address



      public function addresses()
      return $this->hasMany('AppAddress','client_id');



      For you original query you need to assign them unique alias if 2 tables have same name for columns



      DB::table('clients')
      ->join('accounts', 'clients.id', '=', 'accounts.client_id')
      ->join('addresses', 'clients.address_id', '=', 'addresses.id')
      ->select('clients.*', 'accounts.*', 'addresses.*', DB::raw('accounts.comments as account_comments'),DB::raw('addresses.comments as address_comments'))
      ->get();


      Also its not a good idea to select all the columns from a joined query, select only columns that you really need






      share|improve this answer

























        0












        0








        0







        You could use eloquent way with eager load your relations



        $clients = Client::with(['accounts','addresses'])->get();


        When you loop through $clients on each iteration you will have a collection for related addresses and accounts for each client



        class Client extends Model

        public function accounts()
        return $this->hasMany('AppAccounts','client_id');





        Also your relation with addresses looks suspicious if a client has one address then its ok to have an address id in clients table, If a client has multiple addresses then addresses table should have a client_id as foreign key,



        If client has one address



        public function address()

        return $this->belongsTo('AppAddress', 'address_id');



        If client has more than one address



        public function addresses()
        return $this->hasMany('AppAddress','client_id');



        For you original query you need to assign them unique alias if 2 tables have same name for columns



        DB::table('clients')
        ->join('accounts', 'clients.id', '=', 'accounts.client_id')
        ->join('addresses', 'clients.address_id', '=', 'addresses.id')
        ->select('clients.*', 'accounts.*', 'addresses.*', DB::raw('accounts.comments as account_comments'),DB::raw('addresses.comments as address_comments'))
        ->get();


        Also its not a good idea to select all the columns from a joined query, select only columns that you really need






        share|improve this answer













        You could use eloquent way with eager load your relations



        $clients = Client::with(['accounts','addresses'])->get();


        When you loop through $clients on each iteration you will have a collection for related addresses and accounts for each client



        class Client extends Model

        public function accounts()
        return $this->hasMany('AppAccounts','client_id');





        Also your relation with addresses looks suspicious if a client has one address then its ok to have an address id in clients table, If a client has multiple addresses then addresses table should have a client_id as foreign key,



        If client has one address



        public function address()

        return $this->belongsTo('AppAddress', 'address_id');



        If client has more than one address



        public function addresses()
        return $this->hasMany('AppAddress','client_id');



        For you original query you need to assign them unique alias if 2 tables have same name for columns



        DB::table('clients')
        ->join('accounts', 'clients.id', '=', 'accounts.client_id')
        ->join('addresses', 'clients.address_id', '=', 'addresses.id')
        ->select('clients.*', 'accounts.*', 'addresses.*', DB::raw('accounts.comments as account_comments'),DB::raw('addresses.comments as address_comments'))
        ->get();


        Also its not a good idea to select all the columns from a joined query, select only columns that you really need







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Jun 30 '18 at 11:40









        M Khalid JunaidM Khalid Junaid

        53k86395




        53k86395





























            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.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f51114239%2flaravel-iterate-through-join-collection%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

            𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

            Crossroads (UK TV series)

            ữḛḳṊẴ ẋ,Ẩṙ,ỹḛẪẠứụỿṞṦ,Ṉẍừ,ứ Ị,Ḵ,ṏ ṇỪḎḰṰọửḊ ṾḨḮữẑỶṑỗḮṣṉẃ Ữẩụ,ṓ,ḹẕḪḫỞṿḭ ỒṱṨẁṋṜ ḅẈ ṉ ứṀḱṑỒḵ,ḏ,ḊḖỹẊ Ẻḷổ,ṥ ẔḲẪụḣể Ṱ ḭỏựẶ Ồ Ṩ,ẂḿṡḾồ ỗṗṡịṞẤḵṽẃ ṸḒẄẘ,ủẞẵṦṟầṓế