title: Yii2 user model with relational tables
body: <p>I'm new to Yii and I have problem with its User and login system .
  I should use 3 tables for login check but when I use custom query I face </p>
  
  <p><code>"Argument 1 passed to yii\web\User::login() must implement interface yii\web\IdentityInterface, ActiveQuery given"</code></p>
  
  <p>my tables are like :</p>
  
  <ul>
  <li><code>user : user_id, name, family, birthday, ...</code></li>
  <li><code>email : email_user_fk, email_addr, email_active, email_cdt</code></li>
  <li><code>passwd : passwd_user_fk, passwd_hashed, passwd_active, passwd_cdt</code></li>
  </ul>
  
  <p>and my query is like :
  <code>SELECT 
    user.user_id, email.email_addr, email.email_active, 
    passwd.passwd_hashed, passwd_passwd_active , ...
  FROM user
    JOIN email ON user.user_id = email.email_user_fk
    JOIN passwd ON user.user_id = passwd.passwd_user_fk
  WHERE
    email.email_addr = :email</code></p>
  
  <p>Is there any Idea ,Please ??</p>
  
  <pre><code>class User extends ActiveRecord implements IdentityInterface
  {
      const STATUS_DELETED = 0;
      const STATUS_ACTIVE = 10;
  
      /**
       * @inheritdoc
       */
      public static function tableName()
      {
          return 'user';
      }
  
      public static function primaryKey(){
          return 'user_id';
      }
  
      /**
       * @inheritdoc
       */
      public function behaviors()
      {
          return [
              TimestampBehavior::className(),
          ];
      }
  
  
      /**
       * @inheritdoc
       */
      public static function find
  
      Identity($id)
          {
          return static::findOne(['id' =&gt; $id, 'status' =&gt; self::STATUS_ACTIVE]);
      }
  
      /**
       * @inheritdoc
       */
      public static function findIdentityByAccessToken($token, $type = null)
      {
          throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
      }
  
      /**
       * Finds user by username
       *
       * @param string $username
       * @return static|null
       */
      public static function findByUsername($username)
      {
          return static::findOne(['email' =&gt; $username]);
      }
  
      public static function findByEmail($email)
      {
          return User::find()
              -&gt;joinWith(['emails'])
              -&gt;where("email.email_address = 'me@mail.com' ")
              -&gt;one();
      }
  
      public static function findByMobile($email)
      {
          return User::find()
              -&gt;joinWith(['mobiles'])
              -&gt;where("mobile.mobile_address = '0931515124' ")
              -&gt;one();
      }
  
  
      /**
       * Finds user by password reset token
       *
       * @param string $token password reset token
       * @return static|null
       */
      public static function findByPasswordResetToken($token)
      {
          if (!static::isPasswordResetTokenValid($token)) {
              return null;
          }
  
          return static::findOne([
              'password_reset_token' =&gt; $token,
              'status' =&gt; self::STATUS_ACTIVE,
          ]);
      }
  
      /**
       * Finds out if password reset token is valid
       *
       * @param string $token password reset token
       * @return boolean
       */
      public static function isPasswordResetTokenValid($token)
      {
          if (empty($token)) {
              return false;
          }
          $expire = Yii::$app-&gt;params['user.passwordResetTokenExpire'];
          $parts = explode('_', $token);
          $timestamp = (int) end($parts);
          return $timestamp + $expire &gt;= time();
      }
  
      /**
       * @inheritdoc
       */
      public function getId()
      {
          return $this-&gt;getPrimaryKey();
      }
  
      /**
       * @inheritdoc
       */
      public function getAuthKey()
      {
          return $this-&gt;auth_key;
      }
  
      /**
       * @inheritdoc
       */
      public function validateAuthKey($authKey)
      {
          return $this-&gt;getAuthKey() === $authKey;
      }
  
      /**
       * Validates password
       *
       * @param string $password password to validate
       * @return boolean if password provided is valid for current user
       */
      public function validatePassword($password)
      {
          return Yii::$app-&gt;security-&gt;validatePassword($password, $this-&gt;password_hash);
      }
  
      /**
       * Generates password hash from password and sets it to the model
       *
       * @param string $password
       */
      public function setPassword($password)
      {
          $this-&gt;password_hash = Yii::$app-&gt;security-&gt;generatePasswordHash($password);
      }
  
      /**
       * Generates "remember me" authentication key
       */
      public function generateAuthKey()
      {
          $this-&gt;auth_key = Yii::$app-&gt;security-&gt;generateRandomString();
      }
  
      /**
       * Generates new password reset token
       */
      public function generatePasswordResetToken()
      {
          $this-&gt;password_reset_token = Yii::$app-&gt;security-&gt;generateRandomString() . '_' . time();
      }
  
      /**
       * Removes password reset token
       */
      public function removePasswordResetToken()
      {
          $this-&gt;password_reset_token = null;
      }
  
      public function rules()
      {
          return [
              [['user_name', 'user_family', 'user_birthday'], 'required'],
              [['user_gender', 'city_id_fk', 'user_status'], 'integer'],
              [['user_birthday', 'user_cdt'], 'safe'],
              [['user_name'], 'string', 'max' =&gt; 32],
              [['user_family'], 'string', 'max' =&gt; 48],
              [['user_tel', 'user_postcode'], 'string', 'max' =&gt; 12],
              [['user_address'], 'string', 'max' =&gt; 128],
              [['user_profile_image', 'user_cover_image'], 'string', 'max' =&gt; 256]
          ];
      }
  
  
  
      /**
       * @return \yii\db\ActiveQuery
       */
      public function getEmails()
      {
          return $this-&gt;hasMany(Email::className(), ['email_user_id_fk' =&gt; 'user_id']);
      }
  
  
      /**
       * @return \yii\db\ActiveQuery
       */
      public function getMobiles()
      {
          return $this-&gt;hasMany(Mobile::className(), ['mobile_user_id_fk' =&gt; 'user_id']);
      }
  
  
      /**
       * @return \yii\db\ActiveQuery
       */
      public function getPasswds()
      {
          return $this-&gt;hasMany(Passwd::className(), ['passwd_user_id_fk' =&gt; 'user_id']);
      }
  
  }
  </code></pre>