Lançado Adianti Framework 7.6!
Clique aqui para saber mais
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 completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto 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.         
  7.         return $this->contatos;
  8.     }
  9. ?>


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


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