我有4个表格,分别是代理商,供应商,操作员和票证。票证仅属于代理商,供应商或运营商之一。
我设计的票务表有两个字段:org_type
和org_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中进行过滤和排序
有人可以给我解决方案吗?
答案 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')
}
通过这种方式,您可以完全获得正常运行的关系(延迟加载,联接等),但要花一些查询开销
替代方法是更改数据库