【问题标题】:Yii mergeWith() in many-to-many relationsYii mergeWith() 在多对多关系中
【发布时间】: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


【解决方案1】:

在 AND 情况下,您可以加入 flatoptions N 次(传递了多少参数),并使用类似于:

$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->with dynamic() 和不同的别名,然后将每个 addColumnCondition 放入循环中。

链接:

CDbCriteria->with()

CActiveRecord->relations()

【讨论】:

  • 你能在 Skype (gzhegow) 中帮助我吗,我会显示我的代码,我这样做了,但他们找到了所有变体或 0 个变体,没有 1 个变体
  • 在此处显示您的代码。您可以更新您的问题。肯定有人会帮助你的。我得走了。
  • 我不知道该怎么办 with() + 不同的别名,需要 - with = array('alias' => ) ???
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多