Search code examples
phpyiicactivedataprovider

How to get join attributes in CDbCriteria in YII?


In company model I get joining models user and business_unit.

$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
$criteria->compare('status',$this->status);

$criteria->condition = "`t`.status = '1'";
$criteria->order = 'created DESC';
$criteria->join = " inner join  users on users.company_id = `t`.id";

$criteria->condition = "`t`.status = '1'";
$criteria->order = 'created DESC';
$criteria->join = " inner join  business_unit on business_unit.company_id = `t`.id";

It works. But I get only company attributes.How I get business_unit and users attributes along with company attributes


Solution

  • You should create relations in "company" models for users and business_unit, such as :

    1) The first thing is to check if you have the two relations in Company models, for users and business_unit:

    public function relations()
    {
        return array(
            'users' => array(self::HAS_MANY, 'User', 'company_id'),
            'businessUnits' => array(self::HAS_MANY, 'BusinessUnit', 'company_id'),
        );
    }
    

    2) Then you can create criteria with:

    $criteria=new CDbCriteria;
    $criteria->compare('id',$this->id);
    $criteria->compare('status',$this->status);
    $criteria->with = array('users', 'businessUnits');
    $criteria->together = true;
    

    3) To have all models:

    $models = Company::model()->findAll($criteria);
    

    Then for each model you have users and business unit:

    foreach($models as $m)
    {
         // Users
         $users = $m->users;
         $bu = $m->businessUnit;
    }
    

    4) To have active data provider:

    $dataProvider = new CActiveDataProvider('Company', array('criteria' => $criteria);