Yii mergeWith()在多对多关系中

时间:2013-12-02 18:16:47

标签: php sql database activerecord yii

请帮助解决写作结果的一项微不足道的任务:

表:

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);

1 个答案:

答案 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放在循环中。

<强>链接:

CDbCriteria->with()

CActiveRecord->relations()