There is a table of users

CREATE TABLE `user` ( `user_id` INT(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`user_id`) ) COLLATE='utf8_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=4; INSERT INTO `user` (`user_id`) VALUES (1); INSERT INTO `user` (`user_id`) VALUES (2); INSERT INTO `user` (`user_id`) VALUES (3); 

And a table storing users who are subscribed to other users)

 CREATE TABLE `user_subscriber` ( `user_subscriber_id` INT(11) NOT NULL AUTO_INCREMENT, `user_id` INT(11) NULL DEFAULT NULL, `subscriber_id` INT(11) NULL DEFAULT NULL, PRIMARY KEY (`user_subscriber_id`), INDEX `user_id` (`user_id`), INDEX `subscriber_id` (`subscriber_id`), CONSTRAINT `fk-user_subscriber-user` FOREIGN KEY (`subscriber_id`) REFERENCES `user` (`user_id`) ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT `fk-user_subscriber-user-self` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ON UPDATE CASCADE ON DELETE CASCADE ) COLLATE='utf8_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=4; INSERT INTO `user_subscriber` (`user_id`, `subscriber_id`) VALUES (1, 2); INSERT INTO `user_subscriber` (`user_id`, `subscriber_id`) VALUES (1, 3); INSERT INTO `user_subscriber` (`user_id`, `subscriber_id`) VALUES (3, 2); INSERT INTO `user_subscriber` (`user_id`, `subscriber_id`) VALUES (3, 1); 

where user_id is subscribed to

subscriber_id - who is subscribed

For example, the 1st user has two subscribers of the 2nd and 3rd users, and in turn is subscribed to the 3rd user.

I try to make relaying to the user.

 class User extends ActiveRecord { /** * @return \yii\db\ActiveQuery */ public function getUserSubscribers() { return $this->hasMany(UserSubscriber::className(), ['user_id' => 'user_id']); } /** * @return \yii\db\ActiveQuery */ public function getSubscribers() { return $this->hasOne(User::className(), ['user_id', 'subscriber_id']) ->via('userSubscribers'); } } 

Well, pull it out

 //Тут все подтянулось $userSubscribers = $model->userSubscribers; //А вот тут ловлю ошибку $subscribers = $model->subscribers; 

SQLSTATE [42S22]: Column not found: 1054 Unknown column '0' in 'where clause' SQL line executed: SELECT * FROM user WHERE ( 0 , 1 ) IN ((1, 2), (1, 3))

For some reason the request breaks. Perhaps because of the link to himself.

  • maybe you need to make one relationship? public function getUserSubscribers () {return $ this-> hasMany (static :: className (), ['user_id' => 'subscriber_id']) -> viaTable (UserSubscriber :: tableName (), ['user_id' => 'user_id ']); } - WebCoder

1 answer 1

The idea should be something like

 /** * @property integer $user_id * @property User[] $subscribers * @property UserSubscriber[] $userSubscribers */ class User extends ActiveRecord { public function getUserSubscribers() { return $this->hasMany(UserSubscriber::className(), ["user_id" => "user_id"]); } public function getSubscribers() { return $this->hasMany(User::className(), ["user_id" => "user_id"])->viaTable(UserSubscriber::tableName(), ['subscriber_id' => 'user_id']); } } /** * @property integer $user_id * @property integer $subscriber_id * @property User[] $user * @property User[] $subscriber */ class UserSubscriber extends ActiveRecord { public function getUser() { return $this->hasOne(User::className(), ['user_id' => 'user_id']); } public function getSubscriber() { return $this->hasOne(User::className(), ['user_id' => 'subscriber_id']); } } 

I also advise you to read on inverseOf for example here

  • Thank you, pushing on my mistake. It is also possible via via , simply by negligence indicated in the ['user_id', 'subscriber_id'] ['user_id' => 'subscriber_id'] instead of ['user_id' => 'subscriber_id'] - Ninazu