I have a table with multiple rows, which contain parent and child rows, in case I need to get data to the same collection. This means getting child row data inside the parent row using laravel.
| id | type | price | is_substitute | subsitute_parent |
|---|---|---|---|---|
| 1 | Type A | 12 | 0 | null |
| 2 | Type B | 44 | 1 | 1 |
| 3 | Type C | 23 | 1 | 1 |
| 4 | Type D | 11 | 0 | null |
| 5 | Type E | 45 | 1 | 4 |
| 6 | Type F | 25 | 1 | 4 |
“subsitute_parent” id means the parent row id of this table. How can I do this using laravel.
I tried using get all data from the table and the add collection to foreach and then create parent row array and child row array, but this method is not efficient.
$returnedData = ItemModel::all();
$structPODetails = [];
foreach ($returnedData as $tableRow) {
if (!empty($tableRow->subsitute_parent)) {
$structPODetails['child_items'][] = $tableRow;
} else {
$structPODetails['parent_items'][] = $tableRow;
}
}
return $structPODetails;
Advertisement
Answer
As I understood
In ItemModel.php
class ItemModel extends Model
{
public function parent()
{
return $this->belongsTo(ItemModel::class, 'subsitute_parent');
}
public function children()
{
return $this->hasMany(ItemModel::class, 'subsitute_parent');
}
}
Then in the controller, add.
$structPODetails = ItemModel::with('children')->get();
This will give you output as
[
{
"id": 1,
...
"children": [
{
"id": 2,
..
},
{
"id": 3,
...
}
]
},
{
"id": 4,
...
"children": [
{
"id": 5,
...
},
{
"id": 6,
..
}
]
}
]