Restingir Dados De Search Com Criteria

[sql]

CREATE TABLE tb_grupo (

id int(11) NOT NULL AUTO_INCREMENT,

nome varchar(80) DEFAULT NULL,

created_at datetime NOT NULL,

updated_at datetime NOT NULL,

ativo int(11) NOT NULL DEFAULT ‘0’,

PRIMARY KEY (id),

UNIQUE KEY idx_grupos_nome (nome)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘Grupos do sitemas’

INSERT INTO tb_grupo(nome)

VALUES(‘Coordenador’), (‘Professor’), (‘Aluno’), (‘Administrador’);

CREATE TABLE tb_usuario (

id int(11) NOT NULL AUTO_INCREMENT,

email varchar(80) NOT NULL,

senha varchar(200) NOT NULL,

fk_grupo_id int(11) NOT NULL,

ativo int(11) DEFAULT NULL COMMENT ‘Se for aluno, fica inativo até o pagamento da inscrição.’,

updated_at datetime NOT NULL,

created_at datetime NOT NULL,

PRIMARY KEY (id),

UNIQUE KEY idx_usuarios_email (email),

KEY tb_grupos_tb_usuarios_fk (fk_grupo_id),

CONSTRAINT tb_grupos_tb_usuarios_fk FOREIGN KEY (fk_grupo_id) REFERENCES tb_grupo (id)

ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT=‘Usuarios do sistema’;

CREATE TABLE tb_dado_pessoal (

id int(11) NOT NULL AUTO_INCREMENT,

nome varchar(80) NOT NULL,

cpf varchar(14) NOT NULL,

data_nascimento date NOT NULL,

telefone varchar(14) NOT NULL,

fk_usuario_id int(11) NOT NULL,

updated_at datetime NOT NULL,

created_at datetime NOT NULL,

PRIMARY KEY (id),

UNIQUE KEY idx_dados_pessoais_cpf (cpf),

KEY tb_usuarios_tb_dados_pessoais_fk (fk_usuario_id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘Dados pessoais dos usuários.’

[/sql]




<?php

class Model extends CActiveRecord

{#código comum aos modelos}

?>

<?php


class Usuario extends Model

{


    public static function model($className = __CLASS__)

    {

        return parent::model($className);

    }


    public function tableName()

    {

        return "dev.tb_usuario";

    }


    public function scopes()

    {

        return array(

            "ativo" => array(

                "condition" => "ativo = 1"

            ),

            "inativo" => array(

                "condition" => "ativo = 0"

            ),

            "coordenador" => array(

                "condition" => "fk_grupo_id = 1"

            ),

            "aluno" => array(

                "condition" => "fk_grupo_id = 3"

            ),

            "professor" => array(

                "condition" => "fk_grupo_id = 2"

            ),

            "administrador" => array(

                "condition" => "fk_grupo_id = 4"

            ),

        );

    }


    public function relations()

    {

        return array(    

            "Grupo" => array(self::BELONGS_TO, "Grupo", "fk_grupo_id"),

            "DadoPessoal" => array(self::HAS_ONE, "DadoPessoal", "fk_usuario_id")

        );

    }


    public function loadModel($id)

    {

        $model = Usuario::model()->ativo()->find("id = :id", array(":id" => $id));

        if($model === null) throw new CHttpException(404, 'The requested page does not exist.');

        return $model;

    }


}


?>




<?php


class DadoPessoal extends Model

{


    public static function model($className = __CLASS__)

    {

        return parent::model($className);

    }


    public function rules()

    {

        return array(

            array("nome", "safe", "on" => "search")

        );

    }


    public function tableName()

    {

        return "dev.tb_dado_pessoal";

    }


    public function relations()

    {

        return array(    

            "Usuario" => array(self::BELONGS_TO, "Usuario", "fk_usuario_id"),

        );

    }


    public function search()

    {

        $criteria = new CDbCriteria();

        $criteria->with = array(

            "Usuario" => array(

                 "scopes" => array(

                     "ativo", "professor"

                ),

                'limit' => 15,

                'select' => array('id'),

            ),

        );


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


        $dataProvider = new CActiveDataProvider($this, array("criteria" => $criteria));


        return $dataProvider;

    }


}


?>


<?php


class DadoPessoalController extends Controller

{


    public function actionProfessores()

    {

        $model = new DadoPessoal("search");

        $model->unsetAttributes();


        if(isset($_GET["DadoPessoal"])) $model->attributes = $_GET["DadoPessoal"];


        $this->render("professores", array("model" => $model));

    }


}


?>


#dadoPessoal/professores.php

<?php


/* @var this DadoPessoalController */

/* @var model DadoPessoal */


Yii::app()->clientScript->registerScript('search',

        "

		$('.search-button').click(function(){

		$('.search-form').toggle();

		return false;

});

		$('.search-form form').submit(function(){

		$('#dadoPessoal-grid').yiiGridView('update', {

		data: $(this).serialize()

});

		return false;

});

		");


?>


    <?php echo CHtml::link('Advanced Search', '#', array('class' => 'search-button')); ?>

<div class="search-form" style="display: none">

    <?php


    $this->renderPartial('_search', array('model' => $model));


    ?>

</div>

<!-- search-form -->


<?php


$this->widget('zii.widgets.grid.CGridView',

        array(

    'id' => 'dadoPessoal-grid',

    'dataProvider' => $model->search(),

    'filter' => $model,

    'ajaxUrl' => Yii::app()->createAbsoluteUrl("dadoPessoal/professores"),

    'columns' => array(

        'Usuario.id', 'nome',

        array(

            'class' => 'CButtonColumn',

            'template' => '',

            'buttons' => array()

        ),

    ),

));


?>



A minha intenção é que o CGridView liste apenas os usuarios que são professores, mas o CGridView está listando tudo e exibindo apenas os id dos que são professores. Como resolvo isso?

Obs: removi dos models e controller os código que não se referem a questão.

Uma questão secundária: utilizo o PostgreSQL. Como faço para o Yii entender que as minhas tabelas estão no schema

dev? Reparem a gambiarra que estou utilizando: schema.prefixo_nome_tabela.

Resolvi adicionando ‘joinType’ => ‘INNER JOIN’ ao criério.




<?php 


    public function search()

    {

        $criteria = new CDbCriteria();

        $criteria->with = array(

            "Usuario" => array(

                 "scopes" => array(

                     "ativo", "professor"

                ),

                'joinType' => 'INNER JOIN',

                'limit' => 15,

                'select' => array('id'),

            ),

        );


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


        $dataProvider = new CActiveDataProvider($this, array("criteria" => $criteria));


        return $dataProvider;

    }


?>



Ressuscitando a questão, como faço para a coluna ‘id’ de Usuarios participar da pesquisa?

Opa,

No meu caso fiz so assim:


...

$criteria=new CDbCriteria;


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

...

Funcionar desse jeito, no meu caso também, por existe na tabela dado_pessoal a coluna fk_usuario_id. Mas Como faço para pesquisar uma coluna que existe em outra tabela?

Nessa caso, email, por exemplo.





<?php

 #models/dadoPessoal

    public function search()

    {

        $criteria = new CDbCriteria();

        $criteria->with = array(

            "Usuario" => array(

                "scopes" => array(

                    "ativo", "professor"

                ),

		"joinType" => 'INNER JOIN',

                'limit' => 15,

                'select' => array('id', 'email'),

            ),

        );


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

        $criteria->compare('Usuario.email', $this->Usuario->email, true); #não funciona


        $dataProvider = new CActiveDataProvider($this, array("criteria" => $criteria));


        return $dataProvider;

    }


$this->widget('zii.widgets.grid.CGridView',

        array(

    'id' => 'dadoPessoal-grid',

    'dataProvider' => $model->search(),

    'filter' => $model,

    'ajaxUrl' => Yii::app()->createAbsoluteUrl("dadoPessoal/professores"),

    'columns' => array(

        'fk_usuario_id', 'nome', 'Usuario.email:text:login',

        array(

            'class' => 'CButtonColumn',

            'template' => '',

            'buttons' => array()

        ),

    ),

));