Ajudar Em Uma Consulta Com Relação

Olá galera tenho um model curriculo que tem varias relaçoes. o Caso é que gostaria que mostra-se no grid apenas os registro que a relaçao:


'historicoProfissional' => array(self::HAS_MANY, 'HistoricoProfissional', 'curriculoid'),

'objetivoProfissional' => array(self::HAS_MANY, 'ObjetivoProfissional', 'idcurriculo'),

Tenha algum registro cadastrado, caso nao tenha não é para aparecer no grid o registro do curriculo.

segue o model curriculo:




<?php


/**

 * This is the model class for table "curriculo".

 *

 * The followings are the available columns in table 'curriculo':

 * @property integer $id

 * @property string $nome

 * @property string $cep

 * @property string $endereco

 * @property string $bairro

 * @property string $estado

 * @property string $cidade

 * @property string $telefone

 * @property string $telefone2

 * @property string $celular

 * @property string $nacionalidade

 * @property string $datanascimento

 * @property string $sexo

 * @property string $estadocivil

 * @property integer $filhos

 * @property string $cpf

 * @property string $rg

 * @property string $habilitacao

 * @property string $deficiencias

 * @property string $auditiva

 * @property string $fisica

 * @property string $fala

 * @property string $mental

 * @property string $visual

 * @property string $defecienteobservacao

 * @property string $veiculo

 * @property string $obsercacao

 * @property string $senha

 * @property string $datacadastro

 */

class Curriculo extends CActiveRecord

{

	/**

	 * Returns the static model of the specified AR class.

	 * @return Curriculo the static model class

	 */

        public $pesquisar;

       

	public static function model($className=__CLASS__)

	{

		return parent::model($className);

	}


	/**

	 * @return string the associated database table name

	 */

	public function tableName()

	{

		return 'curriculo';

	}


	/**

	 * @return array validation rules for model attributes.

	 */

	public function rules()

	{

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

		// will receive user inputs.

		return array(

			array('nome, senha, cep, endereco, bairro, estado, cidade, telefone, nacionalidade, datanascimento, numero, sexo, estadocivil, filhos, cpf, rg, deficiencias', 'required'),

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

			array('nome, endereco, complemento', 'length', 'max'=>100),

			array('cep, senha', 'length', 'max'=>15),

			array('bairro, estado, cidade, veiculo', 'length', 'max'=>45),

			array('telefone, telefone2, celular, nacionalidade, sexo, estadocivil', 'length', 'max'=>20),

			array('cpf', 'length', 'max'=>14),

			array('rg', 'length', 'max'=>12),

                        array('senha','length', 'max'=>20, 'min' => 6,),

			array('habilitacao, deficiencias', 'length', 'max'=>3),

			array('auditiva, fisica, fala, mental, visual', 'length', 'max'=>1),

			array('defecienteobservacao, obsercacao, datacadastro', 'safe'),

			// The following rule is used by search().

			// Please remove those attributes that should not be searched.

			array('id, nome, cep, endereco, bairro, estado, cidade, telefone, telefone2, celular, nacionalidade, datanascimento, sexo, estadocivil, filhos, cpf, rg, habilitacao, deficiencias, auditiva, fisica, fala, mental, visual, defecienteobservacao, veiculo, obsercacao, senha, datacadastro', 'safe', 'on'=>'search'),

		);

	}


	/**

	 * @return array relational rules.

	 */

	public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'formacao' => array(self::HAS_MANY, 'Formacao', 'idcurriculo'),

                        'cursoComplementar' => array(self::HAS_MANY, 'CursoComplementar', 'idcurriculo'),

			'historicoProfissional' => array(self::HAS_MANY, 'HistoricoProfissional', 'curriculoid'),

			'objetivoProfissional' => array(self::HAS_MANY, 'ObjetivoProfissional', 'idcurriculo'),

		);

	}


	/**

	 * @return array customized attribute labels (name=>label)

	 */

	public function attributeLabels()

	{

		return array(

			'id' => 'ID',

			'nome' => 'Nome',

			'cep' => 'Cep',

			'endereco' => 'Endereco',

			'bairro' => 'Bairro',

			'estado' => 'Estado',

			'cidade' => 'Cidade',

			'telefone' => 'Telefone',

			'telefone2' => 'Telefone(opcional)',

			'celular' => 'Celular',

			'nacionalidade' => 'Nacionalidade',

			'datanascimento' => 'Data Nascimento',

			'sexo' => 'Sexo',

			'estadocivil' => 'Estado Civil',

			'filhos' => 'Qtde de Filhos',

			'cpf' => 'CPF',

			'rg' => 'Rg',

			'habilitacao' => 'Habilitação',

			'deficiencias' => 'Tem algum deficiência?',

			'auditiva' => 'Auditiva',

			'fisica' => 'Física',

			'fala' => 'Fala',

			'mental' => 'Mental',

			'visual' => 'Visual',

                        'complemento' => 'Complemento',

			'defecienteobservacao' => 'Observação da Deficiência',

			'veiculo' => 'Veiculo',

			'obsercacao' => 'Observação',

			'senha' => 'Senha',

                        'numero'=>'Número',

			'datacadastro' => 'Data Cadastro',

		);

	}


	/**

	 * Retrieves a list of models based on the current search/filter conditions.

	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.

	 */




	public function search()

	{

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

		// should not be searched.


		$criteria=new CDbCriteria;

                if($this->pesquisar == ''){

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


		$criteria->compare('nome',$this->nome,true);


		$criteria->compare('cep',$this->cep,true);


		$criteria->compare('endereco',$this->endereco,true);


		$criteria->compare('bairro',$this->bairro,true);


		$criteria->compare('estado',$this->estado,true);


		$criteria->compare('cidade',$this->cidade,true);


		$criteria->compare('telefone',$this->telefone,true);


		$criteria->compare('telefone2',$this->telefone2,true);


		$criteria->compare('celular',$this->celular,true);


		$criteria->compare('nacionalidade',$this->nacionalidade,true);


		$criteria->compare('datanascimento',$this->datanascimento,true);


		$criteria->compare('sexo',$this->sexo,true);


		$criteria->compare('estadocivil',$this->estadocivil,true);


		$criteria->compare('filhos',$this->filhos);


		$criteria->compare('cpf',$this->cpf,true);


		$criteria->compare('rg',$this->rg,true);


		$criteria->compare('habilitacao',$this->habilitacao,true);


		$criteria->compare('deficiencias',$this->deficiencias,true);


		$criteria->compare('auditiva',$this->auditiva,true);


		$criteria->compare('fisica',$this->fisica,true);


		$criteria->compare('fala',$this->fala,true);


		$criteria->compare('mental',$this->mental,true);


		$criteria->compare('visual',$this->visual,true);


		$criteria->compare('defecienteobservacao',$this->defecienteobservacao,true);


		$criteria->compare('veiculo',$this->veiculo,true);


		$criteria->compare('obsercacao',$this->obsercacao,true);


		$criteria->compare('senha',$this->senha,true);


		$criteria->compare('datacadastro',$this->datacadastro,true);


                }else{

            

                       		$criteria->compare('id',$this->pesquisar,true,'OR');


		$criteria->compare('nome',$this->pesquisar,true,'OR');


		$criteria->compare('cep',$this->pesquisar,true,'OR');


		$criteria->compare('endereco',$this->pesquisar,true,'OR');


		$criteria->compare('bairro',$this->pesquisar,true,'OR');


		$criteria->compare('estado',$this->pesquisar,true,'OR');


		$criteria->compare('cidade',$this->pesquisar,true,'OR');


		$criteria->compare('telefone',$this->pesquisar,true,'OR');


		$criteria->compare('telefone2',$this->pesquisar,true,'OR');


		$criteria->compare('celular',$this->pesquisar,true,'OR');


		$criteria->compare('nacionalidade',$this->pesquisar,true,'OR');


		$criteria->compare('datanascimento',$this->pesquisar,true,'OR');


		$criteria->compare('sexo',$this->pesquisar,true,'OR');


		$criteria->compare('estadocivil',$this->pesquisar,true,'OR');


		$criteria->compare('filhos',$this->pesquisar,true,'OR');


		$criteria->compare('cpf',$this->pesquisar,true,'OR');


		$criteria->compare('rg',$this->pesquisar,true,'OR');


		$criteria->compare('habilitacao',$this->pesquisar,true,'OR');


		$criteria->compare('deficiencias',$this->pesquisar,true,'OR');


		$criteria->compare('auditiva',$this->pesquisar,true,'OR');


		$criteria->compare('fisica',$this->pesquisar,true,'OR');


		$criteria->compare('fala',$this->pesquisar,true,'OR');


		$criteria->compare('mental',$this->pesquisar,true,'OR');


		$criteria->compare('visual',$this->pesquisar,true,'OR');


		$criteria->compare('defecienteobservacao',$this->pesquisar,true,'OR');


		$criteria->compare('veiculo',$this->pesquisar,true,'OR');


		$criteria->compare('obsercacao',$this->pesquisar,true,'OR');


		$criteria->compare('senha',$this->pesquisar,true,'OR');


		$criteria->compare('datacadastro',$this->pesquisar,true,'OR');


                }


		return new CActiveDataProvider(get_class($this), array(

			'criteria'=>$criteria,

                        'pagination'=>array(

                        'pageSize'=>Yii::app()->params['PageSize'],

                ),

		));

	}

         public function beforeSave() {

        	if(parent::beforeSave()){

			if($this->isNewRecord){

                                $this->datacadastro=date("Y-m-d H:i:s");


        		}

                        return true;

                }else{

			return false;

                }

        }

}



Agradeço…

Edson,

Se estiver usando a função search(), e somente adicionar:


$criteria->with = array('historicoProfissional', 'objetivoProfissional');

Ai somente será listado os dados que tiver relação com a tabela ‘curriculo’

Blz Newerton,

Então estou usando a função search(), so que ainda continua mostrando na grid registro que nao tem dados cadastrado em ‘historicoProfissional’, ‘objetivoProfissional’, pois como pode ver o que quero é que se o usuario não preencher todos os dados o curriculo dele não entra na lista de seleção.

Fiz o que pediu mais continua mostrando… será que tem alguma forma de usar o count() tipo se o valor for 0 tanto nas relaçoes ‘historicoProfissional’ e ‘objetivoProfissional’ este registro nao entra na lista.

valew

Então adiciona embaixo


$criteria->together = true;

Amigo depois de ter feito as ligações tenta colocar mais ou menos assim:




$criteria->having = 'COUNT(objetivoProfissional.idcurriculo) > 0';



fiz o que pediram…so que agora esta retornando um erro:

CDbCommand falhou ao executar o comando SQL: SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘objetivoProfissional.idcurriculo’ in ‘having clause’

Meu model curriculo:


<?php


/**

 * This is the model class for table "curriculo".

 *

 * The followings are the available columns in table 'curriculo':

 * @property integer $id

 * @property string $nome

 * @property string $cep

 * @property string $endereco

 * @property string $bairro

 * @property string $estado

 * @property string $cidade

 * @property string $telefone

 * @property string $telefone2

 * @property string $celular

 * @property string $nacionalidade

 * @property string $datanascimento

 * @property string $sexo

 * @property string $estadocivil

 * @property integer $filhos

 * @property string $cpf

 * @property string $rg

 * @property string $habilitacao

 * @property string $deficiencias

 * @property string $auditiva

 * @property string $fisica

 * @property string $fala

 * @property string $mental

 * @property string $visual

 * @property string $defecienteobservacao

 * @property string $veiculo

 * @property string $obsercacao

 * @property string $senha

 * @property string $datacadastro

 */

class Curriculo extends CActiveRecord

{

	/**

	 * Returns the static model of the specified AR class.

	 * @return Curriculo the static model class

	 */

        public $pesquisar;

       

	public static function model($className=__CLASS__)

	{

		return parent::model($className);

	}


	/**

	 * @return string the associated database table name

	 */

	public function tableName()

	{

		return 'curriculo';

	}


	/**

	 * @return array validation rules for model attributes.

	 */

	public function rules()

	{

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

		// will receive user inputs.

		return array(

			array('nome, senha, cep, endereco, bairro, estado, cidade, telefone, nacionalidade, datanascimento, numero, sexo, estadocivil, filhos, cpf, rg, deficiencias', 'required'),

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

			array('nome, endereco, complemento', 'length', 'max'=>100),

			array('cep, senha', 'length', 'max'=>15),

			array('bairro, estado, cidade, veiculo', 'length', 'max'=>45),

			array('telefone, telefone2, celular, nacionalidade, sexo, estadocivil', 'length', 'max'=>20),

			array('cpf', 'length', 'max'=>14),

			array('rg', 'length', 'max'=>12),

                        array('senha','length', 'max'=>20, 'min' => 6,),

			array('habilitacao, deficiencias', 'length', 'max'=>3),

			array('auditiva, fisica, fala, mental, visual', 'length', 'max'=>1),

			array('defecienteobservacao, obsercacao, datacadastro', 'safe'),

			// The following rule is used by search().

			// Please remove those attributes that should not be searched.

			array('id, nome, cep, endereco, bairro, estado, cidade, telefone, telefone2, celular, nacionalidade, datanascimento, sexo, estadocivil, filhos, cpf, rg, habilitacao, deficiencias, auditiva, fisica, fala, mental, visual, defecienteobservacao, veiculo, obsercacao, senha, datacadastro', 'safe', 'on'=>'search'),

		);

	}


	/**

	 * @return array relational rules.

	 */

	public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'formacao' => array(self::HAS_MANY, 'Formacao', 'idcurriculo'),

                        'cursoComplementar' => array(self::HAS_MANY, 'CursoComplementar', 'idcurriculo'),

			'historicoProfissional' => array(self::HAS_MANY, 'HistoricoProfissional', 'curriculoid'),

			'objetivoProfissional' => array(self::HAS_MANY, 'ObjetivoProfissional', 'idcurriculo'),

		);

	}


	/**

	 * @return array customized attribute labels (name=>label)

	 */

	public function attributeLabels()

	{

		return array(

			'id' => 'ID',

			'nome' => 'Nome',

			'cep' => 'Cep',

			'endereco' => 'Endereco',

			'bairro' => 'Bairro',

			'estado' => 'Estado',

			'cidade' => 'Cidade',

			'telefone' => 'Telefone',

			'telefone2' => 'Telefone(opcional)',

			'celular' => 'Celular',

			'nacionalidade' => 'Nacionalidade',

			'datanascimento' => 'Data Nascimento',

			'sexo' => 'Sexo',

			'estadocivil' => 'Estado Civil',

			'filhos' => 'Qtde de Filhos',

			'cpf' => 'CPF',

			'rg' => 'Rg',

			'habilitacao' => 'Habilitação',

			'deficiencias' => 'Tem algum deficiência?',

			'auditiva' => 'Auditiva',

			'fisica' => 'Física',

			'fala' => 'Fala',

			'mental' => 'Mental',

			'visual' => 'Visual',

                        'complemento' => 'Complemento',

			'defecienteobservacao' => 'Observação da Deficiência',

			'veiculo' => 'Veiculo',

			'obsercacao' => 'Observação',

			'senha' => 'Senha',

                        'numero'=>'Número',

			'datacadastro' => 'Data Cadastro',

		);

	}


	/**

	 * Retrieves a list of models based on the current search/filter conditions.

	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.

	 */




	public function search()

	{

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

		// should not be searched.


		$criteria=new CDbCriteria;

                if($this->pesquisar == ''){

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


		$criteria->compare('nome',$this->nome,true);


		$criteria->compare('cep',$this->cep,true);


		$criteria->compare('endereco',$this->endereco,true);


		$criteria->compare('bairro',$this->bairro,true);


		$criteria->compare('estado',$this->estado,true);


		$criteria->compare('cidade',$this->cidade,true);


		$criteria->compare('telefone',$this->telefone,true);


		$criteria->compare('telefone2',$this->telefone2,true);


		$criteria->compare('celular',$this->celular,true);


		$criteria->compare('nacionalidade',$this->nacionalidade,true);


		$criteria->compare('datanascimento',$this->datanascimento,true);


		$criteria->compare('sexo',$this->sexo,true);


		$criteria->compare('estadocivil',$this->estadocivil,true);


		$criteria->compare('filhos',$this->filhos);


		$criteria->compare('cpf',$this->cpf,true);


		$criteria->compare('rg',$this->rg,true);


		$criteria->compare('habilitacao',$this->habilitacao,true);


		$criteria->compare('deficiencias',$this->deficiencias,true);


		$criteria->compare('auditiva',$this->auditiva,true);


		$criteria->compare('fisica',$this->fisica,true);


		$criteria->compare('fala',$this->fala,true);


		$criteria->compare('mental',$this->mental,true);


		$criteria->compare('visual',$this->visual,true);


		$criteria->compare('defecienteobservacao',$this->defecienteobservacao,true);


		$criteria->compare('veiculo',$this->veiculo,true);


		$criteria->compare('obsercacao',$this->obsercacao,true);


		$criteria->compare('senha',$this->senha,true);


		$criteria->compare('datacadastro',$this->datacadastro,true);


                }else{

            

                       		$criteria->compare('id',$this->pesquisar,true,'OR');


		$criteria->compare('nome',$this->pesquisar,true,'OR');


		$criteria->compare('cep',$this->pesquisar,true,'OR');


		$criteria->compare('endereco',$this->pesquisar,true,'OR');


		$criteria->compare('bairro',$this->pesquisar,true,'OR');


		$criteria->compare('estado',$this->pesquisar,true,'OR');


		$criteria->compare('cidade',$this->pesquisar,true,'OR');


		$criteria->compare('telefone',$this->pesquisar,true,'OR');


		$criteria->compare('telefone2',$this->pesquisar,true,'OR');


		$criteria->compare('celular',$this->pesquisar,true,'OR');


		$criteria->compare('nacionalidade',$this->pesquisar,true,'OR');


		$criteria->compare('datanascimento',$this->pesquisar,true,'OR');


		$criteria->compare('sexo',$this->pesquisar,true,'OR');


		$criteria->compare('estadocivil',$this->pesquisar,true,'OR');


		$criteria->compare('filhos',$this->pesquisar,true,'OR');


		$criteria->compare('cpf',$this->pesquisar,true,'OR');


		$criteria->compare('rg',$this->pesquisar,true,'OR');


		$criteria->compare('habilitacao',$this->pesquisar,true,'OR');


		$criteria->compare('deficiencias',$this->pesquisar,true,'OR');


		$criteria->compare('auditiva',$this->pesquisar,true,'OR');


		$criteria->compare('fisica',$this->pesquisar,true,'OR');


		$criteria->compare('fala',$this->pesquisar,true,'OR');


		$criteria->compare('mental',$this->pesquisar,true,'OR');


		$criteria->compare('visual',$this->pesquisar,true,'OR');


		$criteria->compare('defecienteobservacao',$this->pesquisar,true,'OR');


		$criteria->compare('veiculo',$this->pesquisar,true,'OR');


		$criteria->compare('obsercacao',$this->pesquisar,true,'OR');


		$criteria->compare('senha',$this->pesquisar,true,'OR');


		$criteria->compare('datacadastro',$this->pesquisar,true,'OR');


                }

                

               $criteria->order = 'datacadastro DESC';

                  

               $criteria->with = array('historicoProfissional', 'objetivoProfissional');

               

               $criteria->together = true;

               

               $criteria->having = 'COUNT(objetivoProfissional.idcurriculo) > 0';


		return new CActiveDataProvider(get_class($this), array(

			'criteria'=>$criteria,

                        'pagination'=>array(

                        'pageSize'=>Yii::app()->params['PageSize'],

                ),

		));

	}

         public function beforeSave() {

        	if(parent::beforeSave()){

			if($this->isNewRecord){

                                $this->datacadastro=date("Y-m-d H:i:s");


        		}

                        return true;

                }else{

			return false;

                }

        }

}

valuew

Edson, para usar o Having é necessário que você agrupe a consulta por alguma coluna, tenta o seguinte:


$criteria->group => 'objetivoProfissional.idcurriculo';

Não sei se isso vai resolver teu problema, mas deve remover o erro que está dando.

vou testar!

valew