SleepWalker
SleepWalker

Reputation: 637

Group users by another user in laravel 5.8

I have this table

enter image description here

I want to group the collectors and display their borrowers.

CollectorMember Model

enter image description here

USER CONTROLLER

public function index(Request $request)
{

    $collectorBorrowers = CollectorMember::with('collector','borrower','referral')->get();

    return view('dashboard.users.index', compact('users','profile','collector'))
            ->with('collectorBorrowers',$collectorBorrowers);
}

in My Blade

@foreach($collectorBorrowers as $cb)
    <tr>
        {{-- <td>{{ $loop->iteration }}</td> --}}
        <td>{{ $cb->collector->name }}</td>
        <td>{{ $cb->borrower }}</td>
        <td>{{ $cb->referral->code }}</td>
    </tr>
@endforeach

Here's the current Output

enter image description here

How can I make the output like this

Collector 1
  - borrowerName 1 | referralcode
  - borrowerName 2 | referralcode
Collector 2
  - borrowerName 1 | referralcode
Collector 3
  - borrowerName 1 | referralcode
  - borrowerName 2 | referralcode
  - borrowerName 3 | referralcode

QUESTION UPDATE Following ROMAN BOBRIK's answer

Now here's my CollectorMembersController looks like,

public function index(Request $request)
{
    $collectorBorrowers = CollectorMember::with('collector','borrower','referral')
      ->get()
      ->groupBy('name');

    return view('dashboard.collector-members.index', compact('collectorBorrowers'));
}

By doing this on my blade

@foreach($collectorBorrowers as $item)
    <tr>
        <td>{{ $item }} ---</td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
    </tr>
@endforeach

Here's the output

enter image description here

On my model I change the hasOne to belongsTo

public function collector()
{
    return $this->belongsTo('App\User', 'collector_id','id');
}

public function borrower()
{
    return $this->belongsTo('App\User', 'borrower_id','id');
}

public function referral()
{
    return $this->belongsTo('App\Referral', 'referral_id','id');
}    

My question is still remain, how can I make the output looks like this,

Collector 1
  - borrowerName 1 | referralcode
  - borrowerName 2 | referralcode
Collector 2
  - borrowerName 1 | referralcode
Collector 3
  - borrowerName 1 | referralcode
  - borrowerName 2 | referralcode
  - borrowerName 3 | referralcode

Here's the dd($collectorBorrowers);

enter image description here

Thank you so much in advance!

Upvotes: 0

Views: 114

Answers (2)

Roman Meyer
Roman Meyer

Reputation: 2872

Try to group collection after you've got data from database:

$collectorBorrowers = CollectorMember::with('collector','borrower','referral')
  ->get()
  ->groupBy('collector.name');

https://laravel.com/docs/5.8/collections#method-groupby

Upvotes: 1

wschopohl
wschopohl

Reputation: 1732

I might not fully understand what you are trying to do, but to me it seems you could use a better relationship description. Instead of using hasOne I would use belongsToMany Laravel # Many To Many

Instead of the CollectorMember Model you would write the methods to your User Model, like so:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function collector()
    {
        return $this->belongsToMany('App\User', 'collector_members', 'borrower_id', 'collector_id');
    }

    public function borrower()
    {
        return $this->belongsToMany('App\User', 'collector_members', 'collector_id', 'borrower_id');
    }
}

This way you can do something like this

$users = App\User::all();

foreach ($user as $users) {
    foreach ($user->borrower as $borrower) {
        // echo $borrower->name;
        // echo $borrower->pivot->referral_id
    }
}

To get access to the referral you can use the pivot method, that gives you access to the intermediate table collector_members.

Upvotes: 1

Related Questions