Нестандартное использование HasManyThrough

11 Августа 2023 16:20

В документации к этому отношению рассмотрен пример взаимодействия по принципу 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` = ?

На этом всё!