Есть две модели - User и Project и связная модель которая их объединяет ProjectUser Выборка всех проектов где есть пользователь организована в модели User:
public function getProjects()
{
return $this->hasMany(Project::class, ['id' => 'fk_project_id'])
->viaTable(ProjectsUsers::tableName(), ['fk_user_id' => 'id'])
->orderBy('title');
}
Выборка всех пользователей в проекте организована:
public function getUsers()
{
return $this->hasMany(User::class, ['id' => 'fk_user_id'])
->viaTable(ProjectsUsers::tableName(), ['fk_project_id' => 'id'])
}
Есть особенность, в таблице Projects, есть поля fk_owner_id, fk_owner_id2, fk_owner_id3, куда назначаются владельцы (Users) по id
Мне нужно получить выборку всех проектов где пользователь является одним из владельцем или участником. На sql я делаю так(пример с id User = 20):
select projects.* FROM projects
left join projectsusers on projectsusers.fk_user_id = 20
where projects.fk_owner_id like 20
or projects.fk_owner_id2 like 20
or projects.fk_owner_id3 like 20
group by projects.title
Как мне организовать правильно запрос внутри модели User ?
Пробовал вот так:
public function getAllProjects(){
$projects = Project::find()
->leftJoin('projectsusers','projectsusers.fk_user_id ='.$this->id)
->orWhere(['fk_owner_id' => $this->id])
->orWhere(['fk_owner_id2' => $this->id])
->orWhere(['fk_owner_id3' => $this->id])
->groupBy('projects.title')
->orderBy('projects.title')
->all();
return $projects;
}
, но это не дает результата.
Решено так:
$query = Project::find()
->with('fkOwner')
->with('fkOwner2')
->with('fkOwner3')
->join(
'join',
ProjectsUsers::tableName(),
ProjectsUsers::tableName().'.fk_project_id = '.Projects::tableName().'.id')
->where(ProjectsUsers::tableName().'.fk_user_id = '.$this->id)
->orWhere(['or',
['fk_owner_id' => $this->id],
['fk_owner_id2' => $this->id],
['fk_owner_id3' => $this->id]
])
->orderBy(Project::tableName().'.title')
->all();
Продвижение своими сайтами как стратегия роста и независимости