Сортировать отношения ребенка по значению внука - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть эта модель Ticket:

class Ticket extends Model
{
    public function items()
    {
        return $this->hasMany('App\Models\TicketItem', 'ticket_id', 'id');
    }
}

и модель TicketItem:

class TicketItem extends Model {    
    public function product()
    {
        return $this->belongsTo('App\Models\Product');
    }
}

и модель продукта:

class Product extends Model {   
    public function category()
    {
        return $this->belongsTo('App\Models\Category');
    }
}

У продукта есть поленазывается category_id.

Когда я делаю App\Models\Ticket::find(123)->load('items.product.category'), я хочу, чтобы ticket.items было отсортировано по ticket.items.product.category_id.

1 Ответ

0 голосов
/ 20 сентября 2018

Следующие действия должны помочь:

App\Models\Ticket::find(123)->load(['items' => function($query) {
  $query->join('products', 'product_id', '=', 'products.id')
    ->orderBy('category_id', 'ASC');
})->load('items.product.category');

Это скажет Eloquent, что при загрузке элементов должны применяться дополнительные критерии обратного вызова.Там вы объединяете элементы с продуктами и сортируете элементы по category_id .

ОБНОВЛЕНИЕ: Чтобы избежать конфликтов в именах столбцов, вы можете использовать псевдонимы для имен таблиц:

App\Models\Ticket::find(123)->load(['items' => function($query) {
  $query->from('ticket_items as tis')
    ->join('products as ps', DB::raw('its.product_id'), '=', DB::raw('ps.id'))
    ->select(DB::raw('tis.*'))
    ->orderBy('category_id', 'ASC');
})->load('items.product.category');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...