Duvida ao enviar POST com fk - REST Criei a API no adianti, já esta funcional. No entanto estou com problemas ao incluir um Movimento com FK de unidade. Tenho duas tabelas 1. Movimento (campos id,descricao,idund) 2. Unidade (id,descricao) Estou testando a api com o postman enviando um POST para cadastrar o movimento com seguinte json: { "unidade": { "id": "2", "descricao": "PREFEITURA" ...
ML
Duvida ao enviar POST com fk - REST  
Criei a API no adianti, já esta funcional. No entanto estou com problemas ao incluir um Movimento com FK de unidade.

Tenho duas tabelas
1. Movimento (campos id,descricao,idund)
2. Unidade (id,descricao)


Estou testando a api com o postman enviando um POST para cadastrar o movimento com seguinte json:
{ "unidade": { "id": "2", "descricao": "PREFEITURA" }, "descricao": "123" }


Mas o adianti só inclui na tabela movimentos o campo descricao, ja o idund fica vazio.
Preciso que fique gravado o id da unidade no campo idund na tabela Movimento.

Meu model de movimento:
class Movimento extends TRecord { const TABLENAME = 'movimentos'; const PRIMARYKEY= 'id'; const IDPOLICY = 'max'; // {max, serial} private $unidade; /** * Constructor method */ public function __construct($id = NULL, $callObjectLoad = TRUE) { parent::__construct($id, $callObjectLoad); parent::addAttribute('undidy'); parent::addAttribute('des'); } /** * Method set_unidade * Sample of usage: $movimento->unidade = $object; * @param $object Instance of Unidade */ public function set_unidade(Unidade $object) { $this->unidade = $object; $this->idund = $object->id; } /** * Method get_unidade * Sample of usage: $movimento->unidade->attribute; * @returns Unidade instance */ public function get_unidade() { // loads the associated object if (empty($this->unidade)) $this->unidade = new Unidade($this->idund); // returns the associated object return $this->unidade; } }

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 (8)


NR

Você está usando as funções padrão da AdiantiRecordService? Se sim, acredito que tenha que passar os dados como colunas simples:
{
"undidy" : 2,
"des" : "descricao123"
}
ML

Sim é o do AdiantiRecordService, resolvi mandando só o proprio id como disse.

Mas agora quando eu for fazer o chamado localhost/app/movimentos/1 queria que ele me retornasse todos os dados da unidade ligada a esse movimento

Exemplo:

{ "status": "success", "data": { "idy": "1", unidade: { "idy": "1", "des": "descricao unidade" }, "obs": "123465" } }


É possível fazer isso ?
NR

Você vai precisar reescrever a função "load" dentro da sua classe de serviço. Copie de AdiantiRecordService e faça as alterações desejadas
ML

Existe algum exemplo desse load ? Não tive sucesso para retornar a descrição da unidade chamando "/servicos"
NR

Se já há a associação criada, veja o exemplo abaixo:
adianti.com.br/framework_files/tutor/index.php?class=AssociationView

Qualquer coisa posta o código aqui
ML

Classe modelo

 
  1. <?php
  2. /**
  3. * Servico Active Record
  4. * @author <your-name-here>
  5. */
  6. class Servico extends TRecord
  7. {
  8. const TABLENAME = 'sla_ser';
  9. const PRIMARYKEY= 'idy';
  10. const IDPOLICY = 'max'; // {max, serial}
  11. private $unidade;
  12. /**
  13. * Constructor method
  14. */
  15. public function __construct($id = NULL)
  16. {
  17. parent::__construct($id, $callObjectLoad);
  18. parent::addAttribute('des');
  19. parent::addAttribute('empidy');
  20. parent::addAttribute('undidy');
  21. parent::addAttribute('dti');
  22. parent::addAttribute('dtf');
  23. parent::addAttribute('sit');
  24. parent::addAttribute('env');
  25. }
  26. /**
  27. * Method set_unidade
  28. * Sample of usage: $servico->unidade = $object;
  29. * @param $object Instance of Unidade
  30. */
  31. public function set_unidade(Unidade $object)
  32. {
  33. $this->unidade = $object;
  34. $this->undidy = $object->idy;
  35. }
  36. /**
  37. * Method get_unidade
  38. * Sample of usage: $servico->unidade->attribute;
  39. * @returns Unidade instance
  40. */
  41. public function get_unidade()
  42. {
  43. // loads the associated object
  44. if (empty($this->unidade))
  45. $this->unidade = new Unidade($this->undidy);
  46. // returns the associated object
  47. return $this->unidade;
  48. }
  49. public function get_unidade_nome()
  50. {
  51. if (empty($this->unidade))
  52. {
  53. $this->unidade = new Unidade($this->undidy);
  54. }
  55. return $this->unidade->des;
  56. }
  57. }
  58. </code>


Classe Serviço Service

public function loadAll($param) { $database = static::DATABASE; $activeRecord = static::ACTIVE_RECORD; TTransaction::open($database); $criteria = new TCriteria; $criteria->add(new TFilter('sit', '=', '1')); if (isset($param['offset'])) { $criteria->setProperty('offset', $param['offset']); } if (isset($param['limit'])) { $criteria->setProperty('limit', $param['limit']); } if (isset($param['order'])) { $criteria->setProperty('order', $param['order']); } if (isset($param['direction'])) { $criteria->setProperty('direction', $param['direction']); } if (isset($param['filters'])) { foreach ($param['filters'] as $filter) { $criteria->add(new TFilter($filter[0], $filter[1], $filter[2])); } } $repository = new TRepository($activeRecord); $objects = $repository->load($criteria, FALSE); $attributes = defined('static::ATTRIBUTES') ? static::ATTRIBUTES : null; $return = []; if ($objects) { foreach ($objects as $object) { //VERIFICAR SE JA EXISTE SERVIÇO AVALIADO NO MES $c2 = new TCriteria; if (isset($param['mes'])) { $c2->add(new TFilter('dat', '=', $param['mes'])); } $c2->add(new TFilter('seridy', '=', $object->idy)); // load using repository $repository = new TRepository('Movimento'); $movimentos = $repository->load($c2); if($movimentos){ $object->env = 1; }else{ $object->env = 0; } $return[] = $object->toArray( $attributes ); } } TTransaction::close(); return $return; }


Na carga do objeto do service está disponivel os campos da chave estrangeira, o problema é retornar eles via json (atualmente só é mostrado o ID), pois estou usando outra aplicação buscar essas informações no adianti.
NR

toArray transforma o objeto em um array. Faça um merge adicionando as demais informações:
 
  1. <?php
  2. $return[] = array_merge($object->toArray($attributes),['unidade_nome'=>$object->unidade_nome]));
  3. ?>
ML

Funcionou Nataniel, muito obrigado !!