Php Yii多对多和CDB标准

Php Yii多对多和CDB标准,php,activerecord,yii,Php,Activerecord,Yii,我正在尝试创建一个将在CActiveDataProvider中使用的CDbCriteria,我需要在多对多关系的另一端查询一个值 我有以下表格: 订单、用户\订单和用户 关系声明正确,因此我可以访问 $order->users[0]并正确查看数据 我试图建立以下标准: $criteria=new CDbCriteria; $criteria->with = array('users'); if (isset($_SESSION['hideCard'])){ $criteria-&

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

我有以下表格: 订单、用户\订单和用户

关系声明正确,因此我可以访问 $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)
));
这基本上意味着,如果设置了会话变量,我想从数据提供程序中隐藏所有fname为“Card”的用户


关于如何在多对多关系中实现这一点,您有什么想法吗?

您应该能够使用:

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

或者,不管users表的别名是什么,我只从关系名称中假定它的
用户。

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

这是使它工作的代码

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

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

$model = Order::model();

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

return new CActiveDataProvider($model, ...)

必须按如下方式修改代码:

$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
}

我试过了,得到了一个未知的专栏。我有3个表,order、user和user\u order,关系在order对象中定义为“users”。你能看到为关系生成的SQL吗,它是否包括
users
表,如果是,它叫什么/表上有哪些列。选择
t
id
as
t0\u c0
t
business\u id
AS
t0\u c1
t
服务
AS
t0\u c2
t
折扣
AS
t0\u c3
t
余额
AS
t0\u c4
t
营业时间
t
status
AS
t0\u c6
t
call\u water
AS
t0\u c7
t
小数
AS
t0\u c8
t
tstamp
AS
t0\u c9
t
站点名称
t
ext\u order
AS
t0\u c11
t
服务员
AS
t0\u c12
t
billnum
AS
t0\u c13
来自
订单
t
哪里(users.fname!=“Card”)限制40.您确定这是唯一的SQL吗?它可能被拆分为多个语句,因为这不会在单个查询中降低关系。在没有这种情况下,一切正常吗?您还可以澄清一下:您不希望这些用户有任何订单,或者您希望这些订单,只是不显示用户?