CakePhp: campos virtuais contendo campos de dados relacionados ao modelo
-
26-09-2019 - |
Pergunta
Eu tenho um funcionário modelo que pertence a um modelo de endereço. Quando busco dados do modelo de funcionários, o registro de endereço associado também é buscado. Além disso, o modelo de endereço possui um VirtualField Full_Name. Parece isso:
Array
(
[0] => Array
(
[Employee] => Array
(
[id] => 1
[address_id] => 33
[username] => ...
...
)
[Address] => Array
(
[id] => 33
[firstname] => Blah
[full_name] => Blah Blubb
...
)
)
[1] => Array (
[Employee] => Array (
[id] => 2
...
Eu quero ter incluído este campo virtual na parte do funcionário também
Array (
[0] => Array (
[Employee] => Array
(
[id] => 1
[full_name] => Blah Blubb
...
)
Não é possível resolver apenas adicionando
$virtualFields = array(
'full_name' => 'CONCAT_WS(" ", Address.firstname, Address.surname)',
);
para o modelo de funcionários, como o livro de receitas estados Há uma solução proposta ("Copie o VirtualFields de um modelo para outro em tempo de execução quando você precisa acessá -los"), mas não entendo essa solução. Onde eu tenho que colocar isso? No controlador? No modelo na função de localização?
Obrigado pela ajuda
Solução 2
Estou fazendo isso à mão agora na função de retorno de chamada do modelo após o modelo:
array_walk($results,function(&$a){
if(isset($a['Address']['full_name'])) {
$a['Employee']['full_name'] = $a['Address']['full_name'];
unset($a['Address']);
}
});
Pode ser que não seja bom, mas funciona.
Outras dicas
http://book.cakephp.org/view/1608/virtual-fields#virtual-fields-and-model-aliases-1632
A implementação do VirtualFields em 1.3 tem algumas limitações. Primeiro, você não pode usar o VirtualFields em modelos associados para condições, pedidos ou matrizes de campos. Isso geralmente resulta em um erro SQL, pois os campos não são substituídos pelo ORM. Isso ocorre porque é difícil estimar a profundidade em que um modelo associado pode ser encontrado.
Adicione o seguinte ao seu modelo:
public function __construct($id=false,$table=null,$ds=null){
parent::__construct($id,$table,$ds);
$this->virtualFields = array(
'full_name'=>"CONCAT(`Address.firstname`,' ',`Address.surname`)"
);
}