Laravel: Iterate through join collection
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
add a comment |
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
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
add a comment |
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
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
mysql laravel join eloquent iteration
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
add a comment |
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
add a comment |
1 Answer
1
active
oldest
votes
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
add a comment |
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
);
);
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%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
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
add a comment |
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
add a comment |
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
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
answered Jun 30 '18 at 11:40
M Khalid JunaidM Khalid Junaid
53k86395
53k86395
add a comment |
add a comment |
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.
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%2fstackoverflow.com%2fquestions%2f51114239%2flaravel-iterate-through-join-collection%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
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