Home > Enterprise >  Get data from same table with child rows in same collection using laravel
Get data from same table with child rows in same collection using laravel

Time:01-17

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;

CodePudding user response:

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,
                ..
            }
        ]
    }
]

CodePudding user response:

use laravel Eloquent way.

In the model add relationship has many

public function substitutes()
{

  return $this->hasMany(ItemModel::class, 'subsitute_parent');
}

and in your controller

$substitutes = ItemModel::with([
        'substitutes' =>
        function ($query) {
            $query->whereNotNull('subsitute_parent');
        }
    ])->whereHas(
            'substitutes',
            function ($query) {
                $query->whereNotNull('subsitute_parent');
            }
        )->get();

CodePudding user response:

Model Logic

 public function substitutes()
    {
        return $this->hasMany(self::class, 'subsitute_parent');
    }

controller logic

  $substitutes = ItemModel::with(['substitutes'])->whereHas('substitutes', function ($query) {
            $query->whereNotNull('subsitute_parent');
        })->get();
  • Related