Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Associação de tabelas com Restfull Olá pessoal tudo bem? Alguém sabe se existe uma postagem aqui no fórum ou exemplo de como realizar associações entre tabelas em receber esses dados através de API RestFull? Tentei achar aqui mas, só acho postagem de associações sem ser com exemplos de RestFull. Obrigado...
A
Associação de tabelas com Restfull  
Olá pessoal
tudo bem?

Alguém sabe se existe uma postagem aqui no fórum ou exemplo de como realizar associações entre tabelas em receber esses dados através de API RestFull?
Tentei achar aqui mas, só acho postagem de associações sem ser com exemplos de RestFull.

Obrigado

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (11)


NR

Você precisa sobrescrever as funções onde os dados das associações são necessários. Usando o exemplo da classe SystemUserRestService que acompanha o template e modificando a função load:
  1. <?php
  2. class SystemUserRestService extends AdiantiRecordService
  3. {
  4.     const DATABASE      'permission';
  5.     const ACTIVE_RECORD 'SystemUser';
  6.     const ATTRIBUTES    = ['id''name''login''email''system_unit_id''active'];
  7.    public function load($param)
  8.     {
  9.         $database     = static::DATABASE;
  10.         $activeRecord = static::ACTIVE_RECORD;
  11.         
  12.         TTransaction::open($database);
  13.         
  14.         $object = new $activeRecord($param['id'], FALSE);
  15.         
  16.         $unit $object->unit;
  17.         
  18.         TTransaction::close();
  19.         $attributes defined('static::ATTRIBUTES') ? static::ATTRIBUTES null;
  20.         
  21.         $dados $object->toArray$attributes );
  22.         $dados['unit'] = $unit->toArray();
  23.         return $dados;
  24.     }
  25. }
  26. ?>
A

Oi Nataniel Rabaioli muito obrigado pelo resposta.

Mas não consegui replicar esse código.

Eu tenho uma tabela empresa e uma tabela ramo_atividades onde a FK fica dentro da tabela empresas.
Quero mostrar na consulta que estou fazendo na classe Empresas a informação, nome_ramo (string).

Como ficaria essa ligação no código que vc me mandou?

Abrasss.
A

Tentei assim
  1. <?php
  2. public function load($param){
  3.         $database       = static::DATABASE;
  4.         $activeRecord = static::ACTIVE_RECORD_RAMO;
  5.         TTransaction::open($database);
  6.         
  7.         $object = new $activeRecord($param['codigo'], FALSE);
  8.         $ramo_atividadades $object->ramo;
  9.         
  10.         TTransaction::close();
  11.         $attributes defined('static::ramo') ? static::ATTRIBUTES null;
  12.         
  13.         $dados $object->toArray$attributes );
  14.         $dados['ramo'] = $ramo_atividadades->toArray();
  15.         return $dados;
  16.     }
  17. ?>


Tentei mas não aparece no retorno do json a informação de ramo (string)
NR

  1. <?php
  2. $ramo_atividadades $object->ramo;
  3. ?>

Para que o trecho acima funcione, você precisa ter criado a associação no modelo. A função get_ramo existe no modelo "Empresa"? E a variável $activeRecord não deveria apontar para o model de empresa? Aparentemente tá apontando pro Ramo, aí você tá tentando pegar o ramo de outro ramo.

Outro trecho estranho é esse:
  1. <?php
  2. $attributes defined('static::ramo')...
  3. ?>

Acredito que deve manter do modo que estava antes.
A

Na empresa está assim:

  1. <?php
  2. class Empresas extends TRecord
  3. {
  4.     const TABLENAME 'empresas';
  5.     const PRIMARYKEY'codigo';
  6.     const IDPOLICY =  'max'// {max, serial}
  7.     
  8.     private $ramo_atividade;
  9.     
  10.     /**
  11.      * Constructor method
  12.      */
  13.     public function __construct($id NULL$callObjectLoad TRUE){
  14.         parent::__construct($id$callObjectLoad);
  15.         parent::addAttribute('codigo');
  16.         parent::addAttribute('razao_social');
  17.         parent::addAttribute('nome_fantasia');
  18.         parent::addAttribute('cnpj');
  19.         parent::addAttribute('cep');
  20.         parent::addAttribute('bairro');
  21.         parent::addAttribute('endereco');
  22.         parent::addAttribute('complemento');
  23.         parent::addAttribute('cnae');
  24.         parent::addAttribute('status');
  25.         parent::addAttribute('ramo_id');
  26.         parent::addAttribute('dt_cadastro');
  27.         parent::addAttribute('dt_atualizacao');        
  28.     }
  29.     public function get_ramo_atividades(){
  30.         if (empty($this->ramo_atividades)){
  31.             $this->ramo_atividades = new RamoAtividades($this->ramo_id);
  32.         }
  33.         return $this->ramo_atividades;
  34.     } 
  35. }
  36. ?>
A

Fiz a alteração no classe EmpresaRestService

  1. <?php
  2. class EmpresasRestService extends AdiantiRecordService{
  3.     const DATABASE      'sgdt';
  4.     const ACTIVE_RECORD 'Empresas';
  5.     const ACTIVE_RECORD_RAMO 'RamoAtividades';
  6.     const ATTRIBUTES    = ['codigo''razao_social''nome_fantasia''cnpj''inscricao_estadual''cep''bairro',
  7.                            'endereco''complemento''cnae''status''dt_cadastro''dt_atualizacao''ramo_id','ramo'];
  8.     
  9.     public static function getBetween($request){
  10.         TTransaction::open('sgdt');
  11.         $empresas = array();
  12.         
  13.         // carrega os produtos
  14.         $all Empresas::where('codigo''>='$request['from'])->where('codigo''<='$request['to'])->load();
  15.         foreach ($all as $empresa){
  16.             $empresas[] = $empresa->toArray();
  17.         }
  18.         TTransaction::close();
  19.         return $empresas;
  20.     }
  21.     
  22.     public function nome_fantasia($request){
  23.         TTransaction::open('sgdt');
  24.         $nome_fantasia Empresas::find($request['codigo'])->nome_fantasia;
  25.         
  26.         TTransaction::close();
  27.         
  28.         return $nome_fantasia;
  29.     }
  30.     public function load($param){
  31.         $database     = static::DATABASE;
  32.         $activeRecord = static::ACTIVE_RECORD;
  33.         TTransaction::open($database);
  34.         
  35.         $object = new $activeRecord($param['ramo_id'], FALSE);
  36.         
  37.         $ramo_atividades $object->ramo;
  38.         
  39.         TTransaction::close();
  40.         
  41.         $attributes defined('static::ATTRIBUTES') ? static::ATTRIBUTES null;
  42.         
  43.         $dados $object->toArray$attributes );
  44.         $dados['ramo'] = $ramo_atividades->toArray();
  45.         //return $dados;
  46.     }
  47. }
  48. ?>
A

Consegui aqui Nataniel.
Mas tenho uma duvida ainda.
Eu vou ter que chamar o metodo load, através da requisição?
localhost/api/empresa/2/load Assim?

O load não carregaria direto quando chamo
localhost/api/empresa/2 ?
NR

Se as rotas estiverem cadastradas corretamente no arquivo .htaccess, na raiz do projeto, não é necessário informar a função load.
A

Obrigado Nataniel
Abrasss
A

Nataniel se eu precisar colocar alguma condição?

$object = new $activeRecord($param['codigo'], FALSE); //consigo colocar nessa linha aqui?

tipo assim:

$object = new $activeRecord($param['codigo'], FALSE);
$object->where('contratante_id', '<>', '')->load();

A

ou melhor eu posso colocar condições para as consultas dentro da model?
tipo na model de Empresa....