Pergunta

Quero receber dados do modelo por Find (todos), mas o usuário deve obter apenas um conjunto restrito de campos de tabela. Isso é fácil:

$ret = $this->find('all',array('fields'=>array(
    'Employee.id','Employee.address_id'
)));

Mas esse modelo (modelo de funcionários) também possui uma associação pertencente:

var $belongsTo = array(
    'Address' => array(
        'className' => 'Address',
        'foreignKey' => 'address_id',
        'fields' => array('Address.full_name')
    )
);

eu quero o Address.full_name Campo para aparecer nos meus dados buscados também. Mas não funciona com a chamada find () acima e lança um erro (erro SQL: 1054: coluna desconhecida 'endereço.full_name' na 'lista de campo') ao tentar:

'fields'=>array('Employee.id','Employee.address_id','Address.full_name')

Alguém sabe como resolver isso?

EDITAR: Eu esqueci totalmente que o endereço.full_name é um campo virtual. Olhando para o SQL produzido pela CakePHP, é óbvio por que não funciona:

SELECT
    `Employee`.`id`, `Employee`.`address_id`, `Address`.`full_name`
FROM
    `employees` AS `Employee`
    LEFT JOIN `addresses` AS `Address`
        ON (`Employee`.`address_id` = `Address`.`id`)
WHERE 1 = 1

No modelo de endereço, Full_Name é definido assim:

var $virtualFields = array(
    'full_name' => 'CONCAT_WS(" ", Address.firstname, Address.surname)'
);

Então, a pergunta é: é um bug do CakePhp que ele não pode incluir campos virtuais (do modelo estrangeiro) em uma lista de campo fornecida para encontrar ()?

Foi útil?

Solução

Infelizmente, você não pode usar campos virtuais da maneira que deseja. A partir de Limitações dos campos virtuais Na documentação do bolo:

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.

Parece que você terá que usar o comportamento contendo.

Outras dicas

Eu usaria o comportamento contendo nesse caso.

Certifique -se de ter o comportamento contendo carregado no seu modelo de funcionários primeiro:

var $actsAs = array('Containable');

Então, quando você está tentando obter seus dados, faça assim:

$params = array('fields' => array('Employee.id', 'Employee.address_id'), 
    'contain' => array('Address' => array('fields' => array('Address.full_name')));
$ret = $this->find('all', $params);

Mais sobre o comportamento contêntico aqui: http://book.cakephp.org/view/1323/containable

Erro SQL: 1054: coluna desconhecida 'endereço.full_name' na 'lista de campo')

Este erro lhe dá uma pista de que algo está errado com o nome da coluna (poderia ser fullname ao invés de full_name) ou, mais provavelmente a sua definição de modelo. Os funcionários pertencem a um endereço, mas o endereço tem funcionários da HaveMany?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top