Yii2有一个到多个表的关系链接

Yii2有一个到多个表的关系链接,yii2,yii2-advanced-app,Yii2,Yii2 Advanced App,我有4张桌子,分别是代理、供应商、接线员和机票。票据只属于代理人、供应商或运营商之一。 我设计的票证表有两个字段:org\u type和org\u id 在票证模型类中,我想构建3个函数getAgent、getVendor、getOperator use,它们之间只有一个Yii2关系 解决方案1: public function getAgent() { if ($this->org != Organization::ORGANIZATION_TYPE__AGENT)

我有4张桌子,分别是代理、供应商、接线员和机票。票据只属于代理人、供应商或运营商之一。 我设计的票证表有两个字段:
org\u type
org\u id
在票证模型类中,我想构建3个函数getAgent、getVendor、getOperator use,它们之间只有一个Yii2关系

解决方案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]);
}
也失败了,因为只有一个关系将进行此查询:
select*from-agent,其中id=3,org='agent'
org
是票证字段,而不是agent

我想在查询joinWith中使用这个hasOne关系,以便在GridView中进行筛选和排序


有人能给我一个解决方案吗?

一个解决方案是与筛选组织类型建立另一个关系,并将其用作从代理表中获取记录的轴心

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')
}
通过这种方式,您可以以查询开销为代价获得完整的功能关系(延迟加载、连接等)
另一种方法是更改数据库