Yii MANY_TO_MANY和CDbCriteria

时间:2012-09-10 08:11:07

标签: php activerecord yii

我正在尝试创建一个将在CActiveDataProvider中使用的CDbCriteria,我需要在多对多关系的另一侧查询一个值。

我有以下表格: order,user_order和user

正确宣布关系,以便我可以访问 $ order-> users [0]并正确查看数据。

我正在尝试建立以下标准:

$criteria=new CDbCriteria;
$criteria->with  = array('users');
if (isset($_SESSION['hideCard'])){
    $criteria->condition = "fname != 'Card'";
}

return new CActiveDataProvider(get_class($this), array(
    'criteria'=>$criteria,
    'pagination'=>array('pageSize'=>40)
));

这基本上意味着如果设置了会话变量,我想隐藏所有来自DataProvider的fname为“Card”的用户。

关于如何在多对多关系中实现这一点的任何想法?

4 个答案:

答案 0 :(得分:1)

您必须像这样修改您的代码:

$criteria=new CDbCriteria;
$criteria->with  = array('users'); // or just string – 'users';
if (isset($_SESSION['hideCard'])){
    $criteria->together = true; // critical fix
    $criteria->condition = "users.fname != 'Card'"; // table alias must be set to ensure filtering proper column
}

答案 1 :(得分:0)

你应该可以使用:

if (isset($_SESSION['hideCard'])){
    $criteria->condition = "users.fname != 'Card'";
}

或者对于users表的别名是什么,我只假设关系名称为users

答案 2 :(得分:0)

我对正在运行的查询进行了分析,并开始构建自己的查询。

以下是使其有效的代码......

public function searchRecent()
    {
        $criteria=new CDbCriteria;
        $criteria->with  = array('users');
        $criteria->join = 'LEFT JOIN user_order uo ON t.id = uo.order_id LEFT JOIN user u ON u.id = uo.user_id';
        $criteria->order     = 't.id DESC';
        if (isset($_SESSION['hideCard'])){
            $criteria->join .= " LEFT JOIN loyalty_members lm ON lm.user_id = u.id";
            $criteria->addCondition("magnetic_id IS NULL");
        }
        if (isset($_SESSION['hidePango'])){
            $criteria->addCondition("u.password != 'PANGO'", "AND");
        }
        $criteria->group = "t.id";
        return new CActiveDataProvider(get_class($this), array(
            'criteria'=>$criteria,
            'pagination'=>array('pageSize'=>40)
        ));
    }

答案 3 :(得分:0)

CActiveDataProvider可以采用模型实例而不仅仅是其类名。这允许您在模型中预设所有条件。然后,您可以在模型中使用'named scopes'。 e.g。

$model = Order::model();

if (isset($_SESSION['someCond'])) {
    $model->someNamedScope();
}
if (isset($_SESSION['otherCond'])) {
    $model->otherNamedScope();
}

return new CActiveDataProvider($model, ...)