所以,我已经扩展CGridView以包含根据我的组织需求量身定制的高级搜索功能。
版本1工作,尽管很慢。基本上,我参与了CGridView的内部工作,在那里我从DataProvider中抓取结果并在渲染表格内容之前在PHP中进行搜索和排序。
现在编写第2版,我的目标是专注于聪明的CDbCriteria创建,允许MySQL进行繁重的工作,以便更快地运行。在处理单个数据库表时,实现是微不足道的。当我处理2个或更多表时出现困难...例如,如果用户想要搜索STAT关系的字段,我需要在我的查询中出现该关系,以便我可以包括比较。
这是问题所在。我如何确保Yii在我的查询中包含所有with
关系,以便我包含比较?我已将我的所有关系with
包含在模型的search
函数中我已经尝试将CDbCriteria的together
设置为true ...
public function search() {
$criteria=new CDbCriteria;
$criteria->compare('id', $this->id);
$criteria->compare( ...
...
$criteria->with = array('relation0','relation1','relation3');
$criteria->together = true;
return new CActiveDataProvider(
get_class($this), array(
'criteria'=>$criteria,
'pagination' => array('pageSize' => 50)
));}
然后我会从DataProvider和add a few conditions抓取条件,例如,查找日期> 1234567890.但我仍然会遇到这样的错误...
CDbCommand failed to execute the SQL statement:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 't.relation3' in 'where clause'.
The SQL statement executed was:
SELECT COUNT(DISTINCT `t`.`id`) FROM `table` `t`
LEFT OUTER JOIN `relation_table` `relation0` ON (`t`.`id`=`relation0`.`id`)
LEFT OUTER JOIN `relation_table` `relation1` ON (`t`.`id`=`relation1`.`id`)
WHERE (`t`.`relation3` > 1234567890)
其中relation0
和relation1
是BELONGS_TO
关系,但任何STAT
关系(此处描述为relation3
)都缺失。此外,为什么查询为SELECT COUNT(DISTINCT 't'.'id')
?
编辑 @DCoder这是我现在正在使用的具体关系。主表是Call,它与CallSegments有HAS_MANY
关系,可以保持时间。因此,呼叫的startTime
是所有相关CallSegments的最小start_time。 startTime
是我匿名查询错误中的假设relation3
。
'startTime' => array(self::STAT, 'CallSegments', 'call_id',
'select' => 'min(`start_time`)'),
修改其他人已将我发送至CDbCriteria's together
property,但正如您在上面所看到的,我目前正在尝试这样做无济于事。
答案 0 :(得分:2)
从标准中抓取sql并自行使用它并不是一个好主意。
如果您使用"使用"属性然后你可以很容易地使用比较:
$criteria->compare("`relation1`.`id`", $yourVarHere);
Yii在分组方面也表现不佳。
我使用STAT关系的方法是在Yii的选择中使用子查询,然后是:
$criteria->select = array("`t`.*", "(SELECT COUNT(*) FROM `relation3` WHERE `id` = `t`.id_relation3) AS `rel3`");
$criteria->having = "`rel3` > " . $yourValue;
上述方法在gridview分页中创建了一个错误,因为计数是在另一个查询上完成的。一个解决方法是放弃""属性并自己在" join"中写入联接。财产如:
$criteria->join = "LEFT OUTER JOIN `relation_table` `relation0` ON (`t`.`id`=`relation0`.`id`)
LEFT OUTER JOIN `relation_table` `relation1` ON (`t`.`id`=`relation1`.`id`)
LEFT OUTER JOIN `relation_table` `relation3` ON (`t`.`id`=`relation3`.`id`)";
答案 1 :(得分:0)
如果bug有点难以开始工作,你可以将stat关系用作简单的HAS_ONE:
'select'=>'count(relation3.id)',
'joinType'=>'left join',
'group'=>'relation3.id',
'on'=>'t.id = relation3.id',
'together'=>true
将计数值与其他所有内容一起取出?
不确定这对你的情况有多好,但它不时对我有帮助。