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

Foi útil?

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`)"
    );
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top