1

我如何表示这个模型的关系:我们有一个包含 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'),
    );
}

以这种方式 $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 回答