отношение "многие ко многим": упорядочение по сводной таблице не работает - PullRequest
0 голосов
/ 05 мая 2020

У меня есть следующие отношения между моделями school и associate:

// School model
public function associates()
{
    return $this->belongsToMany('Associate', 'school_associate', 'school_id', 'associate_id')
        ->withPivot('start_date', 'end_date');
}

// Associate model
public function schools()
{
    return $this->belongsToMany('School', 'school_associate', 'associate_id', 'school_id')
        ->withPivot('start_date', 'end_date');
}

Мне нужно получить всех сотрудников одной школы, заказанных по start_date.

Это то, что я пробовал безуспешно (в этой попытке я ищу во всех школах):

dd(\App\Associate::with(['schools' => function ($q) {
    $q->orderBy('pivot_start_date', 'desc');
}])->toSql());

И я получаю это sql (обратите внимание на предложение order by):

select * from `associate`

Я пробовал чтобы отредактировать отношение следующим образом:

// Associate model
public function schools()
{
    return $this->belongsToMany('School', 'school_associate', 'associate_id', 'school_id')
        ->withPivot('start_date', 'end_date')
        ->orderBy('pivot_start_date', 'desc'); // also tried without "pivot_"
}

И, согласно этому сообщению , я также пробовал:

// Associate model
public function schools()
{
    return $this->belongsToMany('School', 'school_associate', 'associate_id', 'school_id')
        ->withPivot('start_date', 'end_date')
        ->orderBy('school_associate.start_date', 'desc');
}

Но я всегда получаю тот же запрос и результаты не заказываются.

1 Ответ

0 голосов
/ 06 мая 2020

Я решил использовать построитель запросов таким образом.
Эта функция есть в модели Associate:

public function scopeLast($query, $school_ids = [])
{
    $query->join('school_associate', "{$this->table}.{$this->primaryKey}", '=', 'school_associate.associate_id')
        ->join('school', 'school.school_id', '=', 'school_associate.school_id')
        ->whereIn('school.school_id', $school_ids)
        ->orderBy('school_associate.start_date', 'desc');

    return $query;
}
...