【发布时间】:2013-12-02 18:16:47
【问题描述】:
请帮忙解决一项写结果的琐碎任务:
表格:
flats :: id, dateadd
flatparams :: id, title
flatsoptions :: id, flatid, paramid, value
在此处下载 SQL :: http://yadi.sk/d/034so9jIDgfoz 控制器代码在这里下载 :: http://yadi.sk/d/CtGAGZzyDghp7
我需要查找位于某个地区、城市、街道、公寓内的公寓 - 例如:
俄罗斯,莫斯科,papanina,8
我的代码查找所有公寓,它们至少具有这些参数中的一个(如果是 OR),如果是 AND,则没有结果,因为试图在一个表中找到一个字段 flatsoptions 立即所有类型的参数。我想了解如何同时查看多个参数。谢谢!
更新 :: 02-12-2013 22-00
$criteria = new CDbCriteria();
$criteria->together = true;
$i = 0;
foreach ($arr as $key => $item) {
if (in_array($key, $pos)) {
$criteria->join = 'LEFT JOIN flatsoptions AS flatsoptions'.$i.' ON flatsoptions'.$i.'.flatid = t.id';
$criteria->addColumnCondition(
array(
'flatsoptions'.$i.'.paramid' => $params[$key]['id'],
'flatsoptions'.$i.'.value' => $item
),
'AND',
'OR'
);
$i++;
}
}
$flats = Flats::model()->findAll($criteria);
而且这段代码不起作用——他们在“where子句”中找不到别名“flatsoptions0”;
更新 :: 解决方案
count($keys) = count($values); 这是一个Mysql的解决方案::
$criteria = new CDbCriteria();
$criteria->select = array('flatid');
$criteria->addInCondition('paramid', $keys);
$criteria->addInCondition('value', $values);
$criteria->group = 'flatid';
$criteria->having = 'count(*) = '.count($values);
$flats = Flatsoptions::model()->findAll($criteria);
【问题讨论】:
-
最后的解决方案可能会得到错误的结果。例如,您搜索 paramid = 8 和 paramid = 2 并相应地使用值 1 和 2。在 DB 中,您有 paramid = 8 和 paramid = 2,对应的值为 2 和 1。它会找到这 2 行。
-
您之前的代码几乎正确,除了一行:
$criteria->join .= 'LEFT JOIN flatsoptions AS flatsoptions'.$i.' ON flatsoptions'.$i.'.flatid = t.id ';您需要始终添加连接条件,而不是覆盖。最后是空格。
标签: php sql database activerecord yii