2012-09-10 54 views
0

我想创建一个CDbCriteria将用于一个CActiveDataProvider,我需要查询多对多关系的另一端的值。Yii MANY_TO_MANY和CDbCriteria

我有以下表格: 秩序,user_order和用户

的关系宣告正确,所以我可以访问 $命令 - >用户[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用户。

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

回答

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

您应该能够使用:

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

或任何别名是用户表,我只是假设从关系名的users

+0

我试过了,而且越来越未知列。我有3个表格,顺序,用户和user_order,关系被定义为Order对象中的'users'。 –

+0

你可以看到为关系生成的SQL,它是否包括'users'表,如果是的话,它叫什么/它是什么列。 – Paystey

+0

SELECT't'.'id' AS''t0_c0','t'.business_id' AS't0_c1', 't'.service' AS''t0_c2','t'.discount' AS''t0_c3' ,'t'.'balance' AS 't0_c4','t'.open_time' as't0_c5','t'.status' as't0_c6', 't'.call_waiter' AS't0_c7' ,'t'.'decimals' AS't0_c8','t'.tstamp' AS 't0_c9','t'.station_name' as''t0_c10','t'.ext_order' as't0_c11', 't'.'waiter' AS''t0_c12','t'.billnum' AS't0_c13' FROM'order'' t' Where (users.fname!='Card')Limit 40. –

0

CActiveDataProvider可以采取一个模型实例,而不只是它的类名。这使您可以预设模型中的所有条件。然后你可以在你的模型中使用'named scopes'。例如

$model = Order::model(); 

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

return new CActiveDataProvider($model, ...) 
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 
}