1

このモデルの関係をどのように表すことができますか: PKey を持つユーザー テーブルがあります。ユーザーには、雇用主と労働者の 2 つのタイプがあります -> 2 つのテーブルは、ユーザー PKey に再設定された Fkey を保持します。

User モデルで sth を次のようにコーディングしました。

public function userTypeMapper($type) 
{
    switch ($type) {
        case 'w':
            return 'Worker';            
        case 'e':
            return 'Employer';          
        case 'a':
            return 'Admin';         
        default:
            return 'Employer';          
            return 'Guest';         
    }
}   
/**
 * @return array relational rules.
 */
public function relations()
{
    $entity = $this->userTypeMapper($this->u_type);
    return array(
        'entity' => array(self::HAS_ONE, $entity,  'u_id'),
        'projects' => array(self::HAS_MANY, 'Project', 'pr_u_id'),
    );
}

このように、$entity は雇用主モデルと労働者モデルの間で交互に使用されます!!

問題は、それが機能しないことです!!! プロジェクトモデルが所有者を取得するときに u_type が設定されない理由がわかりません (ユーザー内)。リレーションが解釈されるとき、実際には何も設定されません。

4

1 に答える 1

1

モデルが初期化されるとリレーション関数が呼び出され、属性はありません。$user = new User();モデルUserがすでに関係を開始している場合。すべての関係を設定する必要があります。

public function relations()
{
    return array(
        'Worker' => array(self::HAS_ONE, 'Worker',  'u_id'),
        'Employer' => array(self::HAS_ONE, 'Employer',  'u_id'),
        'Admin' => array(self::HAS_ONE, 'Admin',  'u_id'),
        'Guest' => array(self::HAS_ONE, 'Guest',  'u_id'),
        'projects' => array(self::HAS_MANY, 'Project', 'pr_u_id'),
    );
}

/**
 * Get entity
 */
public function getEntity()
{
    switch ($this->u_type) {
        case 'w':
            return $this->Worker;
        case 'e':
            return $this->Employer;
        case 'a':
            return $this->Admin;
        default:
            return $this->Guest;
    }
}

エンティティモデルを取得したい場合は、

$user   = User::model()->findByPk($user_id);
$entity = $user->entity;
于 2013-02-02T15:09:05.523 に答える