Chave primaria com GUID (ou UUID) Prezados, estou começando a usar o adianti framework. Nos meus projetos eu sempre uso como ID um GUID (Globally Unique IDentifier), que é uma string de 32 caracteres (sem delimitadores). A minha dúvida é: como usar como chave primária, se o adianti trabalha com chave primaria como inteiros ??...
GJ
Chave primaria com GUID (ou UUID)  
Prezados, estou começando a usar o adianti framework. Nos meus projetos eu sempre uso como ID um GUID (Globally Unique IDentifier), que é uma string de 32 caracteres (sem delimitadores). A minha dúvida é: como usar como chave primária, se o adianti trabalha com chave primaria como inteiros ??

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


MG

Eu acho que não tem problemas.
Ocorre que você deverá montar os models na mão.
NR

Dê uma olhada no link abaixo:
adianti.com.br/framework_files/tutor/index.php?class=HookMethodView

Acredito que você possa utilizar o método onBeforeStore para realizar a verificação de chave primária e criá-la de acordo com a sua necessidade.
NR

Alguém tem algum exemplo que utilize ( Chave primaria com GUID ) meus projetos mobile e desck top utiliza cheve primaria GUID e preciso fazer uma integração com meu projeto desenvolvido no adanti framework.. algum explo no forum... me ajudem ai galera
GJ

Nilton, eu resolvi da seguinte forma:
Na classe que representa o MODEL, coloquei na chave primaria:

const PRIMARYKEY= 'id';
const IDPOLICY = 'serial';

Ainda no MODEL, defini o onBeforeStore, conforme sugestão do Nataniel Rabaioli.

public function onBeforeStore($object)
{
$pk = $this->getPrimaryKey();

if (!isset($object->$pk))
{
$object->$pk = strtoupper(GenericFunctions::GUIDv4(false));
$this->$pk = $object->$pk;
}
}

RC

Olá Geazi, Tentei implementar essa mesma funcionalidade que vc fez mas no meu caso continua gerando a chave primaria de forma sequencial e com número inteiro.

Há alguma coisa a mais que precisa ser implementada além dessas alterações que vc colocou no Model? devo instalar alguma biblioteca?
RC

Fiz da seguinte forma em meu código mas não funcionou

 
  1. <?php
  2. /**
  3. * SystemUnit
  4. *
  5. * @version 1.0
  6. * @package model
  7. * @subpackage admin
  8. * @author Pablo Dall'Oglio
  9. * @copyright Copyright (c) 2006 Adianti Solutions Ltd. (http://www.adianti.com.br)
  10. * @license http://www.adianti.com.br/framework-license
  11. */
  12. class SystemUnit extends TRecord
  13. {
  14. const TABLENAME = 'system_unit';
  15. const PRIMARYKEY= 'id';
  16. const IDPOLICY = 'serial'; // {max, serial}
  17. /**
  18. * Constructor method
  19. */
  20. public function __construct($id = NULL, $callObjectLoad = TRUE)
  21. {
  22. parent::__construct($id, $callObjectLoad);
  23. parent::addAttribute('name');
  24. }
  25. public function onBeforeStore($object)
  26. {
  27. $pk = $this->getPrimaryKey();
  28. if (!isset($object->$pk))
  29. {
  30. $object->$pk = strtoupper(GenericFunctions::GUIDv4(false));
  31. $this->$pk = $object->$pk;
  32. }
  33. }
  34. }
  35. </code>
GJ

Ricelli,

Acho que o que esta faltando é o arquivo de funcoes, GenericFunctions.
Segue o codigo. Salve com o nome de GenericFunctions.class.php dentro da pasta libutil
O código não é meu. Peguei vasculhando na documentação e forum do php. Acho que é do Dave Pearson (dave@pds-uk.com).
Funciona normalmente.

 
  1. <?php
  2. class GenericFunctions
  3. {
  4. /**
  5. * Returns a GUIDv4 string
  6. *
  7. * Uses the best cryptographically secure method
  8. * for all supported pltforms with fallback to an older,
  9. * less secure version.
  10. *
  11. * @param bool $trim
  12. * @return string
  13. */
  14. public static function GUIDv4 ($trim = true)
  15. {
  16. // Windows
  17. if (function_exists('com_create_guid') === true) {
  18. if ($trim === true)
  19. return trim(com_create_guid(), '{}');
  20. else
  21. return preg_replace('/[^A-Za-z0-9\-]/', '', com_create_guid());
  22. }
  23. // OSX/Linux
  24. if (function_exists('openssl_random_pseudo_bytes') === true) {
  25. $data = openssl_random_pseudo_bytes(16);
  26. $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
  27. $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10
  28. if ($trim === true)
  29. return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
  30. else
  31. return vsprintf('%s%s%s%s%s%s%s%s', str_split(bin2hex($data), 4));
  32. }
  33. // Fallback (PHP 4.2+)
  34. mt_srand((double)microtime() * 10000);
  35. $charid = strtolower(md5(uniqid(rand(), true)));
  36. $hyphen = chr(45); // "-"
  37. $lbrace = $trim ? "" : chr(123); // "{"
  38. $rbrace = $trim ? "" : chr(125); // "}"
  39. $guidv4 = $lbrace.
  40. substr($charid, 0, 8).$hyphen.
  41. substr($charid, 8, 4).$hyphen.
  42. substr($charid, 12, 4).$hyphen.
  43. substr($charid, 16, 4).$hyphen.
  44. substr($charid, 20, 12).
  45. $rbrace;
  46. if ($trim === true)
  47. return $guidv4;
  48. else
  49. return preg_replace('/[^A-Za-z0-9\-]/', '', $guidv4);
  50. }
  51. }
  52. ?>
GJ

Saiu errado. É pra salvar na pasta util dentro da pasta lib
RC

Olá Geazi!

Não sei o que pode estar ocorrendo, fiz dessa maneira que você informou ai, criei o arquivo com a função GenericFunctions, alterei o model colocando a const IDPOLICY = 'serial' mas só gera a chave primária como inteiro, sequencial.

Uma pena, precisava tanto disso funcionando.

A seu campo id da chave primária você deixou como inteiro mesmo, correto?

Assim ficou meu arquivo MODEL

 
  1. <?php
  2. class SystemGuid extends TRecord
  3. {
  4. const TABLENAME = 'guid';
  5. const PRIMARYKEY= 'id';
  6. const IDPOLICY = 'serial'; // {max, serial}
  7. /**
  8. * Constructor method
  9. */
  10. public function __construct($id = NULL, $callObjectLoad = TRUE)
  11. {
  12. parent::__construct($id, $callObjectLoad);
  13. parent::addAttribute('name');
  14. }
  15. public function onBeforeStore($object)
  16. {
  17. $pk = $this->getPrimaryKey();
  18. if (!isset($object->$pk))
  19. {
  20. $object->$pk = strtoupper(GenericFunctions::GUIDv4(false));
  21. $this->$pk = $object->$pk;
  22. }
  23. }
  24. }
  25. ?>
RC

Nos testes que fiz aqui parece que nunca entra neste if da função onBeforeStore

 
  1. <?php
  2. if (!isset($object->$pk)) {
  3. var_dump("Veio aqui"); die();
  4. $object->$pk = strtoupper(GenericFunctions::GUIDv4(false));
  5. $this->$pk = $object->$pk;
  6. }
  7. ?>
LC

Galera, não sei se isso ajuda, mas fica aí a dica, ao invés do onBeforeStore(), vocês criam uma nova classe que estenda TRecord. Daí se o seu modelo usa o guid como chave primária, vocês estendem de GUIDRecord, por exemplo. Espero que funcione pra vocês, não cheguei a testar realmente, só fiz escrever aqui hehe

 
  1. <?php
  2. class GUIDRecord extends TRecord
  3. {
  4. public function store()
  5. {
  6. $pk = $this->getPrimaryKey();
  7. if (!isset($object->$pk))
  8. {
  9. $object->$pk = strtoupper(GenericFunctions::GUIDv4(false));
  10. $this->$pk = $object->$pk;
  11. }
  12. return parent::store();
  13. }
  14. }
  15. ?>