如何表示引用一个主键的两个外键的yii关系?

时间:2013-02-02 12:44:02

标签: php mysql frameworks yii

我如何表示此模型的关系: 我们有一个具有PKey的用户表。用户有两种类型:雇主和工人 - >这两个表将Fkey重新存入用户PKey。

我在用户模型中编写了类似的代码:

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'),
    );
}

在这个方式$实体在雇主和工人模型之间交替!!

问题是它不起作用!!!我不知道为什么当Project model获取所有者(在用户中)时未设置u_type。实际上,在解释关系时没有设置任何内容。

1 个答案:

答案 0 :(得分: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;