Problema retorno Json quando existe uma associação de 1..N Pessoal bom dia Preciso de uma ajuda... Estou com uma situação que é a seguinte: em empresas eu tenho 1 ou N contatos. Na model de empresa eu realizei a ligação como abaixo: Acontece que...
A
Problema retorno Json quando existe uma associação de 1..N  
Pessoal bom dia
Preciso de uma ajuda...
Estou com uma situação que é a seguinte: em empresas eu tenho 1 ou N contatos.
Na model de empresa eu realizei a ligação como abaixo:

 
  1. <?php
  2. public function get_contatos(){
  3. if (empty($this->contatos)){
  4. $this->contatos = new Contato($this->codigo);
  5. }
  6. return $this->contatos;
  7. }
  8. ?>


Acontece que quando realizo o loadAll para trazer essa informação de contatos entro do json de empresas retorna essa mensagem apresentada em print. Quando alguma empresa não tem contato não me retorna mais nada, ae não traz nem as que tem. No caso acredito que o json deveria trazer normal e somente não mostrar contatos na estrutura quando não tem. Como resolvo? obrigado

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (4)


NR

Se você pode ter "n" contatos para uma empresa, deve buscar os contatos via repositório, pois o vínculo(chave estrangeira) de ligação deve estar em contato(empresa_id, por exemplo):
 
  1. <?php
  2. $this->contatos = Contato::where('empresa_id','=',$this->codigo)->load();
  3. ?>
A

Nataniel obrigado por responder mas, agora enfrento outro problema. Fica duplicando os registros de contatos dentro do json de empresas.
Segue códigos e retorno do json.

Empresa.php (parte do get_contatos)

 
  1. <?php
  2. public function get_contatos(){
  3. if (empty($this->contatos)){
  4. $this->contatos = Contato::where('empresa_id', '=', $this->codigo)->load();
  5. }
  6. return $this->contatos;
  7. }
  8. ?>


EmpresasRestService.php (parte do load)
Onde começo a percorrer as empreas está no foreach e la dentro coloque pra pegar os objetos de contatos e colocar dentro de um array para compar o json de empresas.

 
  1. <?php
  2. public function load($param){
  3. $database = static::DATABASE;
  4. $activeRecord = static::ACTIVE_RECORD;
  5. TTransaction::open($database);
  6. //TTransaction::dump(); //liga o sql para debug;
  7. $criteria = new TCriteria;
  8. if (isset($param['start']))
  9. {
  10. $criteria->setProperty('offset', $param['start']); //o extjs manda start e não offset
  11. }
  12. if (isset($param['limit']))
  13. {
  14. $criteria->setProperty('limit', $param['limit']);
  15. }
  16. if (isset($param['order']))
  17. {
  18. $criteria->setProperty('order', $param['order']);
  19. }
  20. if (isset($param['direction']))
  21. {
  22. $criteria->setProperty('direction', $param['direction']);
  23. }
  24. if (isset($param['filter']))
  25. {
  26. foreach (json_decode($param['filter']) as $filter)
  27. {
  28. $criteria->add(new TFilter($filter->property, 'like', '%'.$filter->value.'%'), TExpression::OR_OPERATOR);
  29. }
  30. }
  31. if(isset($param['id'])){
  32. $criteria->add(new TFilter('codigo', '=', $param['id']));
  33. }else{
  34. $criteria->add(new TFilter('codigo', '<>', ''));
  35. }
  36. $repository = new TRepository($activeRecord);
  37. $record = $repository->load($criteria, FALSE);
  38. $attributes = defined('static::ATTRIBUTES') ? static::ATTRIBUTES : null;
  39. //Empresas
  40. $empresas = array();
  41. //$contatos = array();
  42. foreach ($record as $empresa){
  43. if(isset($empresa->codigo)){
  44. if(isset($empresa->contatos[0]->codigo)){
  45. $contatos['contatos'][] = array( "nome" => $empresa->contatos[0]->nome);
  46. }
  47. $ramo_atividade = array("ramo" => $empresa->ramo);
  48. }
  49. $empresas[] = $empresa->toArray($attributes) + $ramo_atividade + $contatos;
  50. }
  51. // reset nos critérios (limit, offset) para a paginação pegar o count total da consulta sql
  52. $criteria->resetProperties();
  53. $count = $repository->count($criteria);
  54. TTransaction::close();
  55. return json_encode(
  56. array(
  57. 'status' => 'success',
  58. 'success' => 'true',
  59. 'total' => $count,
  60. 'perPage' => isset($param['limit']) ? $param['limit'] : '',
  61. 'lastPage' => $count,
  62. 'page' => isset($param['page']) ? $param['page'] : '',
  63. 'data' => $empresas
  64. ));
  65. }
  66. ?>


Json (só um pedaço para vc ver a duplicidade fui até o registro 3)
O Guilherme de oliveira pertence somente a Empresa 1 mas ele aparece nos outros tbm.

"data": [ { "codigo": "1", "ramo_id": "2", "cidade": "Itirapina", "estado": "SP", "razao_social": "Eixo Sp Concessionaria De Rodovias S.a.", "nome_fantasia": "Eixo Sp Concessionaria De Rodovias S.a.", "cnpj": "36146575000164", "inscricao_estadual": null, "cep": "13530000", "bairro": "Zona Rural", "endereco": "Rod Washington Luis", "numero": "0", "complemento": "Km 216 8 Pista Sul", "grau_risco": "1", "status": "A", "dt_cadastro": "2021-01-22 17:19:59", "dt_atualizacao": "2021-02-18 23:23:13", "ramo": "Manutenção ", "contatos": [ { "nome": "Gilson de Oliveira Carvalho" } ] }, { "codigo": "2", "ramo_id": "2", "cidade": "São Paulo", "estado": "SP", "razao_social": "Truck Eixo Importadora E Distribuidora De Auto Pecas Ltda.", "nome_fantasia": "Truck Eixo Importadora E Distribuidora De Auto Pecas Ltda.", "cnpj": "07962064000112", "inscricao_estadual": null, "cep": "02117000", "bairro": "Vl. Maria", "endereco": "R Andarai", "numero": "913", "complemento": null, "grau_risco": "1", "status": "A", "dt_cadastro": "2021-01-22 17:19:59", "dt_atualizacao": "2021-02-18 23:23:13", "ramo": "Manutenção ", "contatos": [ { "nome": "Gilson de Oliveira Carvalho" }, { "nome": "Guilherme Perboyre Cavalcanti" } ] }, { "codigo": "3", "ramo_id": "1", "cidade": "São José Do Rio Preto", "estado": "SP", "razao_social": "R L Servicos E Locacoes De Equipamentos Ltda", "nome_fantasia": "Rl Informatica", "cnpj": "17747146000106", "inscricao_estadual": "isento", "cep": "15086010", "bairro": "Sao Francisco", "endereco": "Avenida Otaviano Fava", "numero": "9520", "complemento": null, "grau_risco": "1", "status": "A", "dt_cadastro": "2021-01-22 17:24:24", "dt_atualizacao": "2021-02-18 23:23:13", "ramo": "Serviços", "contatos": [ { "nome": "Gilson de Oliveira Carvalho" }, { "nome": "Guilherme Perboyre Cavalcanti" }, { "nome": "Eliene Aparecida Cardoso" } ] }]
NR

Você precisa reiniciar a variável $contatos para cada empresa, senão vai ficar acumulando mesmo
A

Consegui Nataniel.

A solução foi usar um array_splice;
Obrigado.

 
  1. <?php
  2. foreach ($record as $empresa){
  3. if(isset($empresa->codigo)){
  4. if(isset($empresa->contatos[0]->codigo)){
  5. foreach($empresa->contatos as $contato){
  6. print_r($contato->empresa_id);
  7. $contatos_array['Contatos'][] = array("nome" => $contato->nome,
  8. "empresa_id" => $contato->empresa_id);
  9. }
  10. }
  11. $ramo_atividade = array("ramo" => $empresa->ramo);
  12. $empresas[] = $empresa->toArray($attributes) + $ramo_atividade + $contatos_array;
  13. array_splice($contatos_array, 0);
  14. }
  15. }
  16. ?>