AA
onSearch na listagem com campos de tabelas diferentes
Boa noite, pessoal.
Tenho uma listagem de registros que dentro da grid possui um campo que não tem referência dentro da Active Record da listagem porque se trata de uma composição e a chave estrangeira está na outra tabela. Assim, a forma que consegui para listar o registro estrangeiro foi criando um método get dentro do Active Record referenciando a tabela estrangeira da composição.
Na listagem tá funcionando como esperado, mas na hora de pesquisar o registro estou recebendo a mensagem:
Tal erro ocorre porque realmente não existe o campo no Active Record Processo, responsável pela listagem, e sim em outra tabela (PoloProcessual) que é responsável pela formação da composição, por isso o código $this->addFilterField('autores', 'like', 'autores'); não funciona já que autores é apenas um método get dentro da Active Record e o seu campo nome está em outra tabela.
Alguém tem uma solução para filtrar a tabela por esse campo estrangeiro?
Grato pela atenção.
Tenho uma listagem de registros que dentro da grid possui um campo que não tem referência dentro da Active Record da listagem porque se trata de uma composição e a chave estrangeira está na outra tabela. Assim, a forma que consegui para listar o registro estrangeiro foi criando um método get dentro do Active Record referenciando a tabela estrangeira da composição.
- <?php
- public function get_autores()
- {
- if (empty($this->autores))
- {
- $processo = new Processo($this->id);
- $pessoas[] = array();
- foreach ( $processo->polo_processual as $polo )
- {
- if ($polo->polo_processual == 'POLO_ATIVO')
- {
- $pessoa = new Pessoa($polo->pessoa_id);
- $autores[$pessoa->id] = $pessoa->nome; // Forma um array com todos os autores, se houver mais de um.
- }
- }
- }
- $str = implode(', ', $autores); // Transforma o array em string separada por vírgula
- return $str;
- }
- ?>
Na listagem tá funcionando como esperado, mas na hora de pesquisar o registro estou recebendo a mensagem:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'autores' in 'where clause'
Tal erro ocorre porque realmente não existe o campo no Active Record Processo, responsável pela listagem, e sim em outra tabela (PoloProcessual) que é responsável pela formação da composição, por isso o código $this->addFilterField('autores', 'like', 'autores'); não funciona já que autores é apenas um método get dentro da Active Record e o seu campo nome está em outra tabela.
Alguém tem uma solução para filtrar a tabela por esse campo estrangeiro?
Grato pela atenção.
Ainda sem consegui fazer essa consulta por esse campo estrangeiro gerado dinamicamente em formato de array. Alguém tem uma solução?
https://www.adianti.com.br/forum/pt/view_866?usando-funcoes-e-subselects-em-crit
O problema é que continuo sem a referência na TRecord. Deixa eu explicar melhor.
Tenho uma tabela chamada processos que possuem diversos campos e tem uma relação de N:N com a tabela pessoas. Para esse implementação criei uma terceira tabela (polos_processuais) para guardar as chaves primárias de processo e pessoa e fazer a vinculação.
A classe ProcessoList</p> possui uma listagem com vários campos próprio da tabela processos e um campo reservado para as pessoas que participam desse processo, cujo atributo se encontra em outra tabela. Para gravar e buscar os dados das pessoas que participam do processo fiz uma composição da classe Processo com a classe PoloProcessual, conforme abaixo:
Todo o processo de gravação de registro e edição está funcionamento beleza, mas o problema é na listagem da grid. Como não tenho qualquer campo na TRecord processo que referencie a tabela polos_processuais eu fiz um método para buscar os dados e retornar um array separado por vírgulas.
Dessa forma, no preenchimento da grid bastou eu chamar esse método get_autores() que os dados foram apresentados. Contudo, esse mesmo método não funciona na busca onSearch. Sempre que eu coloco a chamada do método no TFilter dá o erro:
De igual forma eu não tenho como fazer uma subquery como você postou no link porque não tenho nenhum campo na tabela processo que referencie diretamente a tabela polos_processuais
Entendeu o problema? Alguma solução?
Desde já, agradeço.
Acho que a solução seria por meio de join no SQL.
Tentei esse aqui:
Mas estou sofrendo o seguinte erro:
A referência na TRecord que você precisa é o id:
Puts! Já tinha desistido, :D.
Deu certinho, Nataniel. Comportamento conforme esperado.
Muito obrigado por mais essa.