我正在尝试创建一个将在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”的用户。
关于如何在多对多关系中实现这一点的任何想法?
答案 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, ...)