Tengo un proyecto Laravel 7 y esta estructura de base de datos:
races participants bibs coords ------- -------------- ------ -------- id id id id race_id bib_id bib_id [...]Las relaciones son:
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 ) Entonces también significa que: participants.bib_id = coords.bib_id
Quiero obtener todas las coordenadas relacionadas con una carrera específica. La forma en que lo hice fue usando el generador de consultas de esta manera:
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(); } }Aquí puedo hacer eso:
$coords = Race::find(1)->getCoords(); Funciona como se esperaba, pero estoy buscando una manera de hacerlo usando Eloquent para que sea más fácil de encadenar con más relaciones y esas cosas.
belongsToMany muchas cosas con pertenecen a muchos y hasManyThrough a través, pero nada funcionó. Me pregunto si eso es posible.
// 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); }
Ahora, lo que quieres es encontrar coordenadas para una carrera determinada.
$race = Race::find($id)->with('participants.bib.coords');
Ahora, para extraer coordenadas de él.
$coords = $race->participants->map(function($participant){ return $participant->bib->coords; });
Mantenme informado en los comentarios a continuación. ¡Salud!