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: CakePHP, PHP, Validação