2014-04-23 56 views
0

我是yii的新会员。我有三个型号机型
时,即时通讯选址的下拉我需要的用户属于该站点yii的关系错误

Site(id,name) 
User(id,name,..) 
UserSite(id,user_id,site_id) 

我需要的是

在用户模式的关系是 'userSites' => array(self::BELONGS_TO, 'UserSite', 'id'),

而搜索功能用户模型是,

public function search($sid) 
    { 
     // @todo Please modify the following code to remove attributes that should not be searched. 

     $criteria=new CDbCriteria; 

     $criteria->compare('id',$this->id); 
     $criteria->compare('customer_id',$this->customer_id,true); 
     $criteria->compare('email',$this->email,true); 
     $criteria->compare('password',$this->password,true); 
     $criteria->compare('name',$this->name,true); 
     $criteria->compare('company',$this->company,true); 
     $criteria->compare('country',$this->country,true); 
     $criteria->compare('date_added',$this->date_added,true); 
       $criteria->compare('expiry_date',$this->expiry_date,true); 
       if($sid!=null) 
       { 
        $criteria->with = array('userSites'); 
        $criteria->addCondition('userSites.site_id='.$sid); 
       } 

     return new CActiveDataProvider($this, array(
      'criteria'=>$criteria, 

     )); 
    } 

这里发生的是显示用户喜欢(user.id=user_site.id)但实际上我需要(user.id=user_site.user_id)

现在这种关系'userSites' => array(self::BELONGS_TO, 'UserSite', 'id'),返回UserSite->id什么,我需要它必须返回UserSite->User_id

请有人帮我解决这个问题..

回答

0

你的关系是反向的。每个User可以有很多UserSite小号therfore你们的关系应该是

'userSites' => array(self::HAS_MANY, 'UserSite', 'user_id') 

要急于负载关系的CActiveDataProvider你必须设置CDbCriteria::togethertrue

if($sid!=null){ 
    $criteria->together = true; 
    ... 

对此的解释是在http://www.yiiframework.com/wiki/280/1-n-relations-sometimes-require-cdbcriteria-together/

给出

但跟踪应用程序的查询显示,当CActiveDataProvide r获取数据,它处理1:n相关表有点不同。 AR从父表和1:1相关子表中获取数据,其中一个查询加入所有那些1:1子表。 1:n个子表不属于此查询的一部分。 AR从后续查询中获取数据,每个1:n子表使用一个查询,使用WHERE PK IN(id1,id2,...)子句指定所需的行。

+0

我已经尝试过,当时它的获取错误CDbCommand未能执行SQL语句:SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列'userSites.site_id'。执行的SQL语句是:SELECT't'.'id' AS't0_c0','t'.'customer_id' AS't0_c1','t'.'email' AS''t0_c2','t'.password' as't0_c3','t'.namename' as't0_c4','t'.'company' as't0_c5','t'.country' as as't0_c6','t'.'date_added' as' t0_c7','t'.expiry_date' AS't0_c8' FROM'user'' t' WHERE(userSites.site_id = 4)LIMIT 100 – Salini

+0

我已经编辑了我的答案。 – topher

+0

嘿它固定的代码是$ criteria-> together = true;谢谢.. – Salini