2012-09-10 91 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 
}