Yii Framework Forum: Restingir Dados De Search Com Criteria - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Restingir Dados De Search Com Criteria Rate Topic: -----

#1 User is offline   Rafae 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 6
  • Joined: 22-March 13

Posted 31 March 2013 - 07:01 PM


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.'



<?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.

This post has been edited by Rafae: 31 March 2013 - 07:07 PM

0

#2 User is offline   Rafae 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 6
  • Joined: 22-March 13

Posted 01 April 2013 - 06:59 AM

Quote

<?php

    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;
    }

}

?>


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;
    }

?>

0

#3 User is offline   Rafae 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 6
  • Joined: 22-March 13

Posted 01 April 2013 - 08:49 AM

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

#4 User is offline   Gustavo Andrade 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 121
  • Joined: 16-August 11
  • Location:Brazil - MG

Posted 01 April 2013 - 09:18 AM

View PostRafae, on 01 April 2013 - 08:49 AM, said:

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);
...

0

#5 User is offline   Rafae 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 6
  • Joined: 22-March 13

Posted 01 April 2013 - 02:36 PM

View PostGustavo Andrade, on 01 April 2013 - 09:18 AM, said:

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()
        ),
    ),
));

0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users