inuShiva
inuShiva

Reputation: 173

Laravel Eloquent Sort By Relationship Column

I have several relationships, one specifically that I would like to use for ordering a list, but I can't seem to find the right way to do it.

Below are my relationships:

public function date(){
    return $this->hasOne(agent_billings_dates::class,'id','dateID');
}

public function carrier(){
    return $this->hasOne(customer::class,'id','carrierID');
}

As well as two attributes which I have added as appends:

public function getItemCountAttribute(){
    return $this->items->count();
}

public function getItemMissingAttribute(){
    return $this->itemIssues->count();
}

public function getBatchSumAttribute(){
    return $this->items->sum('amount');

These show up all fine when I have the following in my function:

$batches = agent_billings_batches::with(['date','carrier','carrier.carrierDetails'])
        ->where('status',$request->status)
        ->get();

But the attributes and the with's fall off when I do this (however the date is sorted appropriately):

$batches = agent_billings_batches::with(['carrier','carrier.carrierDetails'])
        ->join('agent_billings_dates', 'agent_billings_dates.id', '=', 'agent_billings_batches.dateID')
        ->orderBy('agent_billings_dates.date','desc')
        ->where('status',$request->status)
        ->get();

Am I doing something wrong? I'd appreciate any help anyone could give.

Thanks!

Upvotes: 0

Views: 7591

Answers (1)

apokryfos
apokryfos

Reputation: 40653

Eloquent does not use Joins when loading relationships. It loads them in a separate query, therefore you cannot order the main result using a relationship at query time, you need to do it after the data is collected:

$batches = agent_billings_batches::with(['date','carrier','carrier.carrierDetails'])
    ->where('status',$request->status)
    ->get()
    ->sortBy(function ($batch) { 
         return $batch->date->date; 
    }); 

Upvotes: 2

Related Questions