Lançado Adianti Framework 8.1!
Clique aqui para saber mais
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.     
  19.     /**
  20.      * Constructor method
  21.      */
  22.     public function __construct($id NULL$callObjectLoad TRUE)
  23.     {
  24.         parent::__construct($id$callObjectLoad);
  25.         parent::addAttribute('name');
  26.     }
  27.     public function onBeforeStore($object
  28.     { 
  29.         $pk $this->getPrimaryKey(); 
  30.         if (!isset($object->$pk)) 
  31.         { 
  32.             $object->$pk strtoupper(GenericFunctions::GUIDv4(false)); 
  33.             $this->$pk $object->$pk
  34.         } 
  35.     }
  36. }
  37. </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.     
  24.         // OSX/Linux
  25.         if (function_exists('openssl_random_pseudo_bytes') === true) {
  26.             $data openssl_random_pseudo_bytes(16);
  27.             $data[6] = chr(ord($data[6]) & 0x0f 0x40);    // set version to 0100
  28.             $data[8] = chr(ord($data[8]) & 0x3f 0x80);    // set bits 6-7 to 10
  29.             if ($trim === true)
  30.               return vsprintf('%s%s-%s-%s-%s-%s%s%s'str_split(bin2hex($data), 4));
  31.             else
  32.               return vsprintf('%s%s%s%s%s%s%s%s'str_split(bin2hex($data), 4));
  33.         }
  34.     
  35.         // Fallback (PHP 4.2+)
  36.         mt_srand((double)microtime() * 10000);
  37.         $charid strtolower(md5(uniqid(rand(), true)));
  38.         $hyphen chr(45);                  // "-"
  39.         $lbrace $trim "" chr(123);    // "{"
  40.         $rbrace $trim "" chr(125);    // "}"
  41.         $guidv4 $lbrace.
  42.                   substr($charid,  0,  8).$hyphen.
  43.                   substr($charid,  8,  4).$hyphen.
  44.                   substr($charid12,  4).$hyphen.
  45.                   substr($charid16,  4).$hyphen.
  46.                   substr($charid2012).
  47.                   $rbrace;
  48.         if ($trim === true)
  49.             return $guidv4;
  50.         else
  51.             return preg_replace('/[^A-Za-z0-9\-]/'''$guidv4);
  52.     }
  53. }
  54. ?>
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.     
  9.     /**
  10.      * Constructor method
  11.      */
  12.     public function __construct($id NULL$callObjectLoad TRUE)
  13.     {
  14.         parent::__construct($id$callObjectLoad);
  15.         parent::addAttribute('name');
  16.     }
  17.     public function onBeforeStore($object
  18.     { 
  19.         $pk $this->getPrimaryKey(); 
  20.         if (!isset($object->$pk)) 
  21.         { 
  22.             $object->$pk strtoupper(GenericFunctions::GUIDv4(false)); 
  23.             $this->$pk $object->$pk
  24.         } 
  25.     }    
  26. }
  27. ?>
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. ?>