Yii2 hasOne关系链接到多个表

时间:2018-08-09 17:19:54

标签: yii2 yii2-advanced-app

我有4个表格,分别是代理商,供应商,操作员和票证。票证仅属于代理商,供应商或运营商之一。 我设计的票务表有两个字段:org_typeorg_id 在Ticket模型类中,我想构建3个函数getAgent,getVendor,getOperator使用Yii2的hasOne关系

解决方案1:

public function getAgent()
{
    if ($this->org != Organization::ORGANIZATION_TYPE__AGENT)
        return null;
    return $this->hasOne(Agent::class, ['id' => 'org_id']);
}

将失败,因为我无法使用$ query-> joinWith('agent');

解决方案2:

public function getAgent()
{
    return $this->hasOne(Agent::class, ['id' => 'org_id'])
        ->andWhere(['org' => Organization::ORGANIZATION_TYPE__AGENT]);
}

也失败了,因为hasOne关系将进行以下查询:select * from agent where id = 3 and org = 'agent'org是故障单的字段,而不是代理。

我想在查询joinWith中使用此hasOne关系,以便可以在GridView中进行过滤和排序

有人可以给我解决方案吗?

1 个答案:

答案 0 :(得分:2)

一种解决方案是使过滤器组织类型具有另一种关系,并以此为基础从代理表中获取记录。

public function getOrganizationForAgent(){
    return $this->hasOne(static::class, ['id' => 'id'])
        ->andOnCondition(['org' => Organization::ORGANIZATION_TYPE__AGENT]);
}

public function getAgent(){
    return $this->hasOne(Agent::class, ['id' => 'org_id'])
        ->via('organizationForAgent')
}

通过这种方式,您可以完全获得正常运行的关系(延迟加载,联接等),但要花一些查询开销
替代方法是更改​​数据库