CDbCriteria and relation tables




<?php 

class InvitationAdmin extends Invitation

{

        public $adminName='Invitations'; // will be displayed in main list

        public $pluralNames=array('Invitation','Invitation');   

        public $serviceChoices=array("facebook"=>"facebook","web"=>"web","twitter"=>"twitter");


        public function attributeLabels()

	{

		return array(

			'id' => 'ID',

			'user_id' => 'User ID',

			'email' => 'Friend_Email',

			'service' => 'Friend_Service',

		);

	}

	public function rules()

	{

		// NOTE: you should only define rules for those attributes that

		// will receive user inputs.

		return array(

                        array('id,service_id','safe'),

			array('user_id, email, service', 'required'),

			array('user_id', 'numerical', 'integerOnly'=>true),

			array('email, service', 'length', 'max'=>45),                        

			array('id, user_id, email, service, service_id', 'safe', 'on'=>'search'),

                        

                        array('user_id', 'Usercheck'),

                      

                        

                        

		);

	}

       public function Usercheck()

        {

            $user=User::model()->findbyPK($this->user_id);

            if(!$user) $this->addError('user_id','There is no such user');    

        }


        public function adminSearch()

        {

            return array(

                'columns'=>array(

                'id',

                'user_id',

                'user.first_name',

                'user.last_name',

                'user.email',        

                /*array(

                  'name'=>'useremail',

                  'value'=>'$data->user->email',  

                ),*/

                  

                'email',

                'service_id',

                array(

                  'name'  =>'service',

                  'filter'=>array('web'=>'web','facebook'=>'facebook','twitter'=>'twitter'),    

                ),

               

                )

            );

        }

        public function attributeWidgets()

        {

            return array(

            array('service','dropDownList'), 

            );            

        }

        	public function search()

	{

		// Warning: Please modify the following code to remove attributes that

		// should not be searched.


		$criteria=new CDbCriteria;


                $criteria->compare('t.id',$this->id,true);

                $criteria->compare('t.service_id',$this->service_id,true);

                $criteria->compare('t.user_id',$this->user_id,true);

                $criteria->compare('t.email',$this->email,true);

                $criteria->compare('t.service',$this->service,true);

                

                $criteria->with=array('user'); //4                               

                //$criteria->compare('user.id',$this->id,true);

                $criteria->compare('user.first_name',$this->user_id);

                $criteria->compare('user.last_name',$this->user_id);

                $criteria->compare('user.email',$this->user_id);                

                

                $sort = new CSort();

                $sort->defaultOrder = 't.id DESC';

                $sort->attributes = array(

                    'id'=>array(

                        'asc'=>'t.id asc',

                        'desc'=>'t.id desc',

                    ),

                    'email'=>array(

                        'asc'=>'t.email desc',

                        'desc'=>'t.email asc',

                    ),

                    'user_id'=>array(

                        'asc'=>'t.user_id desc',

                        'desc'=>'t.user_id asc',

                    ),

                    'service'=>array(

                        'asc'=>'t.service desc',

                        'desc'=>'t.service asc',

                    ),

                    'service_id'=>array(

                            'asc'=>'t.service_id desc',

                            'desc'=>'t.service_id asc',

                        ),

                    'user.first_name'=>array(

                            'asc'=>'user.first_name desc',

                            'desc'=>'user.first_name asc',

                        ),        

                    'user.last_name'=>array(

                            'asc'=>'user.last_name desc',

                            'desc'=>'user.last_name asc',

                        ),                

                        'user.email'=>array(

                            'asc'=>'user.email desc',

                            'desc'=>'user.email asc',

                        ),

                );


                //$criteria->compare('useremail',$this->user_id,true);		

                return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,                        

                        'sort'=>$sort,

                    ));

	}

       public function defaultScope()

        {

            return array(

            'select' => 'id,user_id,email,service,service_id',

            );

        }

}

?>



I made a class.

and have relation


 'user'=>array(self::BELONGS_TO, 'User', 'user_id'),       

the problem is that when in search i add with=array(‘user’) after i can make search by column user_id(i have data for these table), but when i start search by these column nothing ca found. For example ,if ihave 31,32 and i enter in search column 32 nothing found, when i delete with=array(‘user’) and other staff for relation table, everything work?

because

when you set value to search for your example 32

ultimately you have sql look like




where t.id_user=32 and t.user.first_name=32



Hi,

Rudenich is right, you can’t use:




$criteria->compare('user.first_name',$this->user_id);

$criteria->compare('user.first_name',$this->user_id);

$criteria->compare('user.last_name',$this->user_id);



As these are different fields, you can’t have $this->user_id for all.

ok, what to do :rolleyes:

i remake it. everything right now goes ok, just for the relative field i cann’t make LIKE search




class InvitationAdmin extends Invitation

{

    public $adminName='Invitations'; // will be displayed in main list

    public $pluralNames=array('Invitation','Invitation');   

    public $serviceChoices=array("facebook"=>"facebook","web"=>"web","twitter"=>"twitter");

    public $user_search;

    public function attributeLabels()

    {

        return array(

                'id' => 'ID',

                'user_id' => 'User ID',

                'email' => 'Friend_Email',

                'service' => 'Friend_Service',

        );

    }

    public function rules()

    {

        return array(

                    array('id,service_id','safe'),

                    array('user_id, email, service', 'required'),

                    array('user_id', 'numerical', 'integerOnly'=>true),

                    array('email, service', 'length', 'max'=>45),                        

                    array('id, user_id, email, service, service_id,user_search', 'safe', 'on'=>'search'),//2

                    array('user_id', 'Usercheck'),                        

		);

    }

    public function Usercheck()

    {

        $user=User::model()->findbyPK($this->user_id);

        if(!$user) $this->addError('user_id','There is no such user');    

    }


    public function adminSearch()

    {

        return array(

            'columns'=>array(

            'id',

            'user_id',

                

            'user.first_name',

            'user.last_name',

            array( 'name'=>'user_search', 'value'=>'$data->user->email'),                                

            'email',

            'service_id',

            array(

                'name'  =>'service',

                'filter'=>array('web'=>'web','facebook'=>'facebook','twitter'=>'twitter'),    

            ),              

            )

        );

    }

    public function attributeWidgets()

    {

        return array(

        array('service','dropDownList'), 

        );            

    }

            public function search()

    {

            $criteria=new CDbCriteria;

            $criteria->compare('t.id',$this->id,true);

            $criteria->compare('t.service_id',$this->service_id,true);

            $criteria->compare('t.user_id',$this->user_id,true);

            $criteria->compare('t.email',$this->email,true);

            $criteria->compare('t.service',$this->service,true);

            

$criteria->with=array('user');

             

$criteria->compare( 'user.email', $this->user_search);

            

            $sort = new CSort();

            $sort->defaultOrder = 't.id DESC';

            $sort->attributes = array(

                'id'=>array(

                    'asc'=>'t.id asc',

                    'desc'=>'t.id desc',

                ),

                'email'=>array(

                    'asc'=>'t.email desc',

                    'desc'=>'t.email asc',

                ),

                'user_id'=>array(

                    'asc'=>'t.user_id desc',

                    'desc'=>'t.user_id asc',

                ),

                'service'=>array(

                    'asc'=>'t.service desc',

                    'desc'=>'t.service asc',

                ),

                'service_id'=>array(

                        'asc'=>'t.service_id desc',

                        'desc'=>'t.service_id asc',

                    ),

                'user.first_name'=>array(

                        'asc'=>'user.first_name desc',

                        'desc'=>'user.first_name asc',

                    ),        

                'user.last_name'=>array(

                        'asc'=>'user.last_name desc',

                        'desc'=>'user.last_name asc',

                    ),                

                'user_search'=>array(

                    'asc'=>'user.email ASC',

                    'desc'=>'user.email DESC',

                ),

                '*',

            );

            return new CActiveDataProvider($this, array(

                    'criteria'=>$criteria,                        

                    'sort'=>$sort,

                ));

    }

    public function defaultScope()

    {

        return array(

        'select' => 'id,user_id,email,service,service_id',

        );

    }

}



You can add in you model public members like




class InvitationAdmin extends Invitation

{

  public $user_first_name;

.....



then add name of this member

to rule function in your model




 array('id, user_id, email, service, service_id,user_search,user_first_name', 'safe', 'on'=>'search')



in search function




$criteria->compare('user.first_name',$this->user_first_name);



and in your CGridView widget specify name of column

like ‘user_first_name’