0

ユーザーとアカウントのモデルがあります。関係は、ユーザーはアカウントに属し、アカウントには多くのユーザーがいます。

両方のモデルコードは次のとおりです。

ユーザーモデル

public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'account' => array(self::BELONGS_TO, 'Account', 'account_id'),
    );
}

アカウントモデル

public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'users' => array(self::HAS_MANY, 'User', 'account_id'),
                    'userCount'=>array(self::STAT,'User','account_id'),
            );
}

UserIdentity.phpに、ログイン用の次のコードがあります。このコードは正常に機能していました。

public function authenticate()
{
    $user=User::model()->findByAttributes(array('username'=>$this->username));
    if($user===null)
        $this->errorCode=self::ERROR_USERNAME_INVALID;
    else{
                if($user->password!==$user->encrypt($this->password))
                    $this->errorCode=self::ERROR_PASSWORD_INVALID;
                else{
                    $this->_id=$user->id;
                    if($user->last_login_time==null)
                        $lastLogin=time();
                    else
                        $lastLogin=strtotime($user->last_login_time);
                    $this->setState('lastLoginTime', $lastLogin);
                    $this->setState('account',array('id'=>$user->account->id,'name'=>$user->account->name,));
                    $this->errorCode=self::ERROR_NONE;
                }
            }
    return !$this->errorCode;
}

アカウントに別のユーザーを追加すると、エラーが発生し始めました。

PHPの注意:非オブジェクトのプロパティを取得しようとしています

エラーは

$this->setState('account',array('id'=>$user->account->id,'name'=>$user->account->name,));

複数の行に分割した場合:

'id'=>$user->account->id,エラーが発生する場所です。

これを修正するために、私は単にこれに変更しました:

$account=Account::model()->findByPk($user->account_id);
$this->setState('account',array('id'=>$account->id,'name'=>$account->name,));

したがって、ユーザーが1人の場合、関係は正常に機能しましたが、ユーザーが2人の場合、関係は失敗します。上記のようにYiiを使い続けることができますが、オブジェクトに直接アクセスするという単純さが好きでした。関係を正しく設定しませんでしたか?1つのアカウントに2人のユーザーがいる場合、これが機能しないのはなぜですか?

編集:

var_dump($user)-http ://pastebin.com/TEyrFnme

また、次を使用してアカウントからユーザーにアクセスできることも興味深いです。$users=$account->users;そして、すべての$user[0]属性に問題なくアクセスできます。逆に言えば、関係はうまくいっているようで、前進するだけでは難しいようです。

4

1 に答える 1

1

モデル内でリレーションと同じ名前の変数を宣言しないでください。

public $account;

accountYii は、同じ名前のリレーションをチェックする前に、まず実際の属性を検索 (および使用)するため、モデルがリレーションを検索するのを防ぎます。

于 2012-11-05T21:30:57.220 に答える