Sep 28 2008

Validar relacionamento belongsTo no CakePHP

Category: CakePHP,PHPvbmendes @ 11:39

Uma prática que eu acho bastante interessante é verificar se realmente um registro existe no banco antes de associá-lo a outro. Por exemplo, suponha que se têm dois models:

/app/models/pessoa.php
class Pessoa extends AppModel {
    var $name = "Pessoa";
}

/app/models/aluno.php class Aluno extends AppModel { var $name = "Aluno"; var $belongsTo = array( 'Pessoa' => array( 'className' => 'Pessoa', 'foreignKey' => 'pessoa_id' ) ); }

Eu quero que sempre que eu adicionar um aluno, o sistema valide se a pessoa a qual eu estou associando este aluno esteja cadastrada no banco. Ou seja, quero garantir que o aluno estará vinculado a uma pessoa válida.

Para isso eu criei uma função de validação que coloquei no meu app_model.php. Veja:

function checkBelongsTo($data, $relationName){
    $field = $this->belongsTo[$relationName]['foreignKey'];
    $search[$this->{$relationName}->primaryKey] = $data[$field];
    return $this->{$relationName}->find('count',array('conditions' => $search));
}
Vamos analisar o código. A primeira linha da função determina qual o campo que irá conter a foreign key, no nosso caso pessoa_id. A segunda linha gera um array de condições no formato:
Array[primaryKey => valor]
Onde primaryKey é obtido diretamente do model associado, e valor é o id do registro ao qual se quer fazer a relação. Na terceira linha é feita uma busca ao banco para saber quantos registros existem que satisfaçam essa condição, o que, obedecendo a condição de que a chave primária deve ser única, irá retornar 0 ou 1. O resultado desta consulta será o retorno da função. Feito isso, basta adicionar a condição de validação ao model:
/app/models/aluno.php
class Aluno extends AppModel {
    var $name = "Aluno";
    var $validate = array(
        'pessoa_id' => array(
            'rule' => array('checkBelongsTo','Pessoa'),
            'message' => 'Pessoa inexistente.'
        );
    );
    var $belongsTo = array(
        'Pessoa' => array(
            'className' => 'Pessoa',
            'foreignKey' => 'pessoa_id'
        )
    );
}
Perceba que eu adicionei a regra de validação checkBelongsTo passando como parametro o nome do relacionamento entre aluno e pessoa.

Espero ter sido claro. Qualquer dúvida comente.

Tags: , ,

2 Responses to “Validar relacionamento belongsTo no CakePHP”

  1. Thiago says:

    Olá Meio Código, gostaria de implementar esse tipo de condição para meu relacionamento Cliente e Usuario. No qual tenho um cliente e preciso que quando for adicionar novo usuario verificar se existe id na tabela cliente para esse usuario.

    Como posso fazer? Obrigado, Thiago maurothiagobr@yahoo.com.br obs. por favor não publicar essa mensagem, apenas responder no e-mail

  2. Thiago Alves says:

    I recently came across your blog and have been reading along. I thought I would leave my first comment. I dont know what to say except that I have enjoyed reading. Nice blog. I will keep visiting this blog very often.