不要问为什么,但我有这样的表情。Yii - 喜欢条件加入
ActiveRecord的运输公司,TransportDetail和TransportRow与Yii的经典strutture(BELONG_TO,HAS_MANY等...)相关
Unfortunaly,区域,城市和省份不能自动关联由于基于fromTypeId值的条件连接而生成TransportDetails(有toTypeId列)。
Unfortunally我要搜索TransportRow与有类似下面的字段进行搜索的自由文本字段: “company.name”(易与警予的关系) “region.name或city.name或省。名称基于列的值”
为了达到公司名称,一般每一起releation,进出口使用‘与’sintax
$criteria->with = array('transportDetail','transportDetail.transport','transportDetail.transport.company');
有了这个自动加入,通过company.name在OR我合并搜索具有OR标准的基准:
$criteriaORCompany = new CDbCriteria();
$criteriaORCompany->compare('company.name',$searchFilter->name,true,'OR');
$criteria->mergeWith($criteriaORCompany);
这个工作完美。
现在我必须扩展搜索。
这个查询工作正常,但我不知道何重现在Yii上。如果你添加一个连接到其他三个表(市,省,区)和where条件部队使用只有typeColumn具有正确的值,搜索做工精细值:
[ other join ...]
LEFT OUTER JOIN regions cr on (cr.id = transportDetail.fromId)
LEFT OUTER JOIN provinces cp on (cp.id = transportDetail.fromId)
WHERE ((cr.name LIKE '%TEST%' and toTypeId = 'REGION')
OR (cp.name LIKE '%TEST%' and toTypeId = 'PROVINCE'))
我已经试图复制Yii中手动添加的加入,但mergWith发生关系之前加入
$criteriaLIKE = new CDbCriteria;
$crt = Region::model()->tableName();
$cpt = Province::model()->tableName();
$criteriaLIKE->join .= 'LEFT OUTER JOIN '.$crt.' cr on (cr.id = transportDetail.fromId)';
$criteriaLIKE->join .= 'LEFT OUTER JOIN '.$cpt.' cp on (cp.id = transportDetail.fromId)';
$criteriaLIKE->addCondition("cr.name LIKE '%probe%' and toTypeId = 'REGION'",'OR');
$criteriaLIKE->addCondition("cp.name LIKE '%probe%' and toTypeId = 'PROVINCE'",'OR');
我试图把mergeWith与之后,但它不工作这个连接:
$criteria->with = array('transportDetail','transportDetail.transport','transportDetail.transport.company');
$criteria->mergeWith($criteriaLIKE);
错误很简单。随着地区和省份加入其他地区,SQL无法在ON条件中找到该列,因为拥有这些列,但后来加入了一张表。
对不起,对于很长的文章。
有什么建议吗?
您需要咨询?修复架构/模型。那么你不需要问这个问题,因为你没有问题。你可能会感觉到,当你必须这样做的时候,这一天将会到来,所以今天这一天可能就是今天。 – Bohemian
我无法触摸数据库或模型。 – MrMime
您可以向您的主管提出这样的工作,解释当前的数据库/模型已损坏,除非完成,否则进一步的功能增强将非常困难。请参阅[技术债务](https://en.m.wikipedia.org/wiki/Technical_debt)了解您的情况的完整描述。 – Bohemian