因此,我扩展了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)
));}
Run Code Online (Sandbox Code Playgroud)
然后我将从DataProvider中抢夺条件并添加一些条件,例如,查找日期> 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)
Run Code Online (Sandbox Code Playgroud)
在哪里relation0和relation1是BELONGS_TO关系,但任何STAT关系,这里描述为relation3,都缺失.此外,为什么查询是SELECT COUNT(DISTINCT 't'.'id')?
编辑 @DCoder这是我现在正在使用的具体关系.主表是Call,它HAS_MANY与CallSegments有关,可以保持时间.因此startTime,Call是所有相关CallSegments的最小start_time.并且startTime是relation3我的匿名查询错误中的假设.
'startTime' => array(self::STAT, 'CallSegments', 'call_id',
'select' => 'min(`start_time`)'),
Run Code Online (Sandbox Code Playgroud)
编辑其他人已将我发送给CDbCriteria的together财产,但正如您在上面所看到的,我目前正在尝试这样做无济于事.
小智 2
从条件中抢夺 SQL 并自己使用它并不是一个好主意。
如果您使用“with”属性,那么您可以轻松地使用如下比较:
$criteria->compare("`relation1`.`id`", $yourVarHere);
Run Code Online (Sandbox Code Playgroud)
此外,Yii 在分组方面表现不佳。
我处理 STAT 关系的方法是在 Yii 的选择中使用子查询,然后是:
$criteria->select = array("`t`.*", "(SELECT COUNT(*) FROM `relation3` WHERE `id` = `t`.id_relation3) AS `rel3`");
$criteria->having = "`rel3` > " . $yourValue;
Run Code Online (Sandbox Code Playgroud)
上述方法在 gridview 分页中创建了一个错误,因为计数是在不同的查询上完成的。解决方法是删除“with”属性并在“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`)";
Run Code Online (Sandbox Code Playgroud)