Laravel Красноречивый эквивалент запроса QueryBuilder - PullRequest
4 голосов
/ 16 июня 2020

У меня есть проект Laravel 7 и эта структура базы данных:

 races      participants      bibs      coords
-------    --------------    ------    --------
 id         id                id        id
            race_id                     bib_id
            bib_id                      [...]

Отношения следующие:

1 race        =>  N participants  ( races.id = participants.race_id )
1 participant =>  1 bib           ( participants.bib_id = bibs.id )
1 bib         =>  N coords        ( bibs.id = coords.bib_id )

Это также означает, что: participants.bib_id = coords.bib_id

Я хочу получить все координаты, относящиеся к определенной c расе. Я использовал построитель запросов следующим образом:

class Race extends Model
{
    public function getCoords()
    {
        return Coord::join('participants', 'participants.bib_id', '=', 'coords.bib_id')
            ->where('participants.race_id', $this->id)->select('coords.*')->get();
    }
}

Здесь я могу это сделать:

$coords = Race::find(1)->getCoords();

Он работает, как ожидалось, но я ищу способ сделать он использует Eloquent, чтобы было легче связать с большим количеством отношений и прочего.
Я пробовал много вещей с belongsToMany и hasManyThrough, но ничего не работало. Интересно, возможно ли это вообще?

1 Ответ

1 голос
/ 16 июня 2020
// Race
public function participants()
{
    return $this->hasMany(Participant::class);
}

// Participant
public function bib()
{
    return $this->belongsTo(Bib::class);
}
public function race()
{
    return $this->belongsTo(Race::class);
}

// Bib
public function coords()
{
    return $this->hasMany(Coord::class);
}

// Coord
public function bib()
{
    return $this->belongsTo(Bib::class);
}


Теперь вам нужно найти координаты для данной расы.

$race = Race::find($id)->with('participants.bib.coords');


Теперь, чтобы извлечь из него координаты.

$coords = $race->participants->map(function($participant){
              return $participant->bib->coords;
          });


Оставляйте меня в комментариях ниже. Ура!

...