Php Yii多对多和CDB标准
我正在尝试创建一个将在CActiveDataProvider中使用的CDbCriteria,我需要在多对多关系的另一端查询一个值 我有以下表格: 订单、用户\订单和用户 关系声明正确,因此我可以访问 $order->users[0]并正确查看数据 我试图建立以下标准: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-&
$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
ast0\u c0
,t
business\u id
ASt0\u c1
,t
服务ASt0\u c2
,t
折扣ASt0\u c3
,t
余额ASt0\u c4
,t
营业时间,t
status
ASt0\u c6
,t
call\u water
ASt0\u c7
,t
小数ASt0\u c8
,t
tstampASt0\u c9
,t
站点名称,t
ext\u order
ASt0\u c11
,t
服务员ASt0\u c12
,t
billnum
ASt0\u c13
来自订单t
哪里(users.fname!=“Card”)限制40.您确定这是唯一的SQL吗?它可能被拆分为多个语句,因为这不会在单个查询中降低关系。在没有这种情况下,一切正常吗?您还可以澄清一下:您不希望这些用户有任何订单,或者您希望这些订单,只是不显示用户?