@maxyc_webber
Web-программист

Yii2, Relations, Что то с логикой поссорился. Подтолкните в нужном направлении?

Задача: Есть пользователи. Есть лидеры, есть бегуны. У лидера может быть до 5ти бегунов, который тот обучает. Связь 1 ко многим. 1 лидер, много бегунов.
Таблица проста до безобразия: id, login, team_id, team_status
team_id - id лидера в этой же таблице
team_status - статус, принят, выгнан и пр...

public function getTeam(){
		if($this->getIsLeader())
			return $this->hasMany(self::className(), ['team_id'=>'id']);
		else
			return User::find()->where(['id'=>$this->team_id])->one()->getTeam(); // WTF?
	}

	public function getTeam_count(){
		return $this->getTeam()->count();
	}


Сделал вот таким образом. Если это лидер, то просто вывожу его команду.
Но что сделать, если я один из бегунов команды? Не могу никак с логикой в голове разобраться. Как вывести всех участников команды, в которой я состою? В т.ч. и лидера?
  • Вопрос задан
  • 229 просмотров
Решения вопроса 1
restyler
@restyler
В вашем случае я бы порекомендовал у лидера выставлять team_id равным его же id, тогда никаких сложных условий и union вам делать не понадобится (если я конечно все правильно понял из описания задачи)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Mishutka2000
У тренера team_id = id
Тогда запрос, не зависимо кто это лидер или бегун, будет выдавать всю группу:
SELECT id,  login FROM `user`
    WHERE team_id = (
	          SELECT team_id FROM `user`
                 WHERE id = 1 # ID участника группы
			 ) 
    AND team_status = 'active';
Ответ написан
Комментировать
@maxyc_webber Автор вопроса
Web-программист
пока пришел к такому. но может есть норм вариант? мне этот не нравится своей сложностью
public function getTeam(){
		if($this->getIsLeader())
			return $this->hasMany(self::className(), ['team_id'=>'id']);
		else{
			return User::find()->where(['id'=>$this->team_id])->one()->getTeam()->where('id != :uid', [':uid'=>$this->id])
				->union($this->hasOne(self::className(), ['id'=>'team_id']));
		}
	}

	public function getTeam_count(){
		return $this->getTeam()->count();
	}


хотя sql норм вроде
(SELECT * FROM `user` WHERE (id != 8538) AND (`team_id`=1)) UNION ( SELECT * FROM `user` WHERE `id`=1 )
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы