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

Yii2: Сложные relation и dataprovider. Поможете?

Итак. Есть соц сеть. Куча таблиц и зависимостей. Вот часть из них.
Пользователь может быть владельцем клуба (club.owner_id) и может состоять в клубАХ (users_clubs) - many_many
Zt-sB8nK_HQ.jpg

Каждый пользователь генерирует события. События привязаны только к пользователю. Необходимо сделать вывод в gridview список событий в клубе. То есть выводить события всех пользователей относящихся к конкретному клубу.

Набросал вот такой sql
SELECT
					e.id, e. c.club_id, u.name
				FROM
					events AS e

					JOIN user AS u
						ON e.owner_id = u.id
					JOIN users_clubs AS uc
						ON uc.user_id = u.id
					JOIN clubs AS c
						ON c.id = uc.club_id

				WHERE
					c.id = :club_id


Имеются модели:
User
public function getClubs(){
		return $this->hasMany(Club::className(), ['id'=>'club_id'])
			->viaTable('users_clubs', ['user_id'=>'id']);
	}

Event
public function getOwner(){
		return $this->hasOne(User::className(), ['id'=>'owner_id']);
	}

Club
public function getMembers($count = 100){
		return $this->hasMany(User::className(), ['id'=>'user_id'])
			->limit($count)
			->viaTable('users_clubs', ['club_id'=>'id'], function($query){
				$query->where(['status'=>User::STATUS_CLUB_JOINED_APPROVED]);
			});
	}


Search модели Event
public function search($params) {

		$query = Event::find(); // я так понимаю вся движуха должна быть здесь или вынесена в EventQuery впоследствии
		$this->scenario = 'search';

		$dataProvider = new \yii\data\ActiveDataProvider([
			'query'=>$query,
		]);
		
		if (!($this->load($params) && $this->validate())) {
			return $dataProvider;
		}

		$query->andFilterWhere(['id' => $this->id]);


		return $dataProvider;
	}


Есть ли у кого время и возможность помочь с вопросом?
  • Вопрос задан
  • 11257 просмотров
Решения вопроса 1
@maxyc_webber Автор вопроса
Web-программист
... $params['club_id'] = 1 ...
$query = Event::find()->joinWith(['owner.clubs'=>function($query) use ($params) {
	return $query->where(['clubs.id'=>$params['club_id']]);
}]);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы