Im not 100% sure what you want to accomplish, but I think you need relationships: https://laravel.com/docs/5.2/eloquent-relationships
Looping through a collection to retrieve corresponding row in a seperate table
Hi everyone,
I'm currently having trouble working with some of the data in my database. To give you a little background, the goal is to display an item's status as it moves through a production line. The status represents what phase of development it is at (1-4). To move to a new phase, that object has to meet certain criteria (which the user defines when the item is created--so those criteria can be different from item to item). What I want to do, is have the view output a table for each phase with two columns; one column that describes what the criteria is, and a second to show what score the item received for that particular criterion.
Now I have two tables in my database for storing this information. One is called item_parameters and it has the following columns:
id INT PK,AI
item_statuses_id INT FK
status_specifications_id INT FK
value VARCHAR
created_at TIMESTAMP
updated_at TIMESTAMP
The second table, status_specifications, stores what the criteria is that an item needs to meet in order to advance to the next phase. It's column values are:
id INT PK,AI
template_name VARCHAR
tier INT
param_title VARCHAR
param_definition TEXT
created_at TIMESTAMP
updated_at TIMESTAMP
In order to retrieve all of the values from item_parameters and all of the definitions that describe those values from item_specifications I have the following in my controller:
...
// get all item parameter values that are tied to the item
$item_parameter = $this->item_parameters
->where('item_statuses_id', '=', $item->iStatus->id)
->get();
// return all of the specs for advancing an item to the next tier
$i = 1;
foreach ($item_parameter as $item_params)
{
$specsOne[$i] = $this->status_specifications
->where('id', '=', $item_params->status_specifications_id)
->whereIn('tier', [1])
->get();
$specsTwo[$i] = $this->status_specifications
->where('id', '=', $item_params->status_specifications_id)
->whereIn('tier', [2])
->get();
$specsThree[$i] = $this->status_specifications
->where('id', '=', $item_params->status_specifications_id)
->whereIn('tier', [3])
->get();
$specsFour[$i] = $this->status_specifications
->where('id', '=', $item_params->status_specifications_id)
->whereIn('tier', [4])
->get();
$i = $i + 1;
}
// Remove empty values from all of the specs arrays
$specsOne = array_merge(array_diff($specsOne, array("[]")));
$specsTwo = array_merge(array_diff($specsTwo, array("[]")));
$specsThree = array_merge(array_diff($specsThree, array("[]")));
$specsFour = array_merge(array_diff($specsFour, array("[]")));
return view ('backend.items.index',
compact('item', 'item_parameter',
'specsOne', 'specsTwo',
'specsThree', 'specsFour'));
Now, I'm not in love with how the above is written. I definitely welcome advice on a better approach, but I think part of where my confusion is coming from is how to loop through the collection that is stored in $item_parameter so that I get back an item_specifications collection. Because right now, what I'm getting back from that foreach loop is four collections, that each store within them a collection ($specsOne, $specsTwo, $specsThree and $specsFour are each a collection of collections). This is problematic, because if I want to output just the 'param_definition' of one of those $specs... variables, I can't access it by doing something like $specsOne->param_definition. In fact, the closest I've gotten is to do something like this:
$specsOne[$i] = $this->status_specifications
->where('id', '=', $item_params->status_specifications_id)
->whereIn('tier', [1])
->select('param_definition')
->get();
That returns this:
[{"param_definition":"Selectivity > 50 for competing site"}]
Which is sort of an improvement over this:
[{"id":2,"template_name":"tier_one_default","tier":1,"param_title":"selectivity","param_definition":"Selectivity > 50 for competing site","created_at":null,"updated_at":null}]
But not really.
So to summarize, I'm basically wondering if anyone can suggest the correct approach in Laravel for first querying one table which returns a collection, and then looping through that collection to retrieve the corresponding row in a separate table for each of those items so that I can access individual data points in all of the returned collections?
I know this has been a rather long post, so thank you for taking the time to read all of this, and many additional thanks for anyone who takes the time to offer some help. I really appreciate it!
Please or to participate in this conversation.