В документации к этому отношению рассмотрен пример взаимодействия по принципу Project -> (project_id)Environment -> (environment_id)Deployment т.е. последовательно, но это отношение можно применить немного по другому, например, вот так Project -> (project_id)Environment(deployment_id) <- Deployment.
То есть, если у нас есть 3 модели, одна из которых связывает 2 другие через внешние ключи, а именно: таблица environments
имеет 2 ключа - project_id
и deployment_id
и мы хотим в Project получить Deployment через Environment.
Реализуется это просто:
class Project extends Model
{
...
public function deployments(): HasManyThrough
{
return $this->hasManyThrough(Deployment::class, Environment::class, 'project_id', 'id', 'id', 'deployment_id');
}
...
}
Само по себе, отношение может показаться муторным, особенно, в первое использование, но в дальнешем понимаешь, что им можно варировать по разному.
Отладку можно производить через метод toSql()
, чтобы убедиться, что SQL-запрос формируется правильный:
select * from `deployments` inner join `environments` on `environments`.`deployment_id` = `deployments`.`id` where `environments`.`project_id` = ?
На этом всё!