请帮助解决写作结果的一项微不足道的任务:
表:
flats :: id, dateadd
flatparams :: id, title
flatsoptions :: id, flatid, paramid, value
SQL DOWNLOAD HERE :: http://yadi.sk/d/034so9jIDgfoz 控制器代码在这里下载:: http://yadi.sk/d/CtGAGZzyDghp7
我需要找到一个地区,城市,街道,公寓的公寓 - 例如:
俄罗斯,莫斯科,papanina,8
我的代码查找所有公寓,其中至少有一个参数(如果是OR),如果是AND,那么没有结果,因为试图在一个表格中立即找到一个字段的各种参数。我想了解如何同时看几个参数。谢谢!
更新:: 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);
答案 0 :(得分:0)
在AND情况下,你可以加入flatoptions N次(传递了多少个params),并使用类似的代码:
$criteria->addColumnCondition(
array(
'flatsoptions1.paramid' => $params[$key1]['id'],
'flatsoptions1.value' => $item1
),
'AND',
'AND'
);
$criteria->addColumnCondition(
array(
'flatsoptions2.paramid' => $params[$key2]['id'],
'flatsoptions2.value' => $item2
),
'AND',
'AND'
);
...
$criteria->addColumnCondition(
array(
'flatsoptionsN.paramid' => $params[$keyN]['id'],
'flatsoptionsN.value' => $itemN
),
'AND',
'AND'
);
这只是一个例子。你需要首先使用不同的别名为动态()定义$ criteria-> ,然后将每个addColumnCondition放在循环中。
<强>链接:强>