Yii2有一个到多个表的关系链接
我有4张桌子,分别是代理、供应商、接线员和机票。票据只属于代理人、供应商或运营商之一。 我设计的票证表有两个字段: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)
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')
}
通过这种方式,您可以以查询开销为代价获得完整的功能关系(延迟加载、连接等)另一种方法是更改数据库