Pergunta

Estou criando um aplicativo em que o usuário pode criar meta -campo para armazenar dados no banco de dados, esses campos receberão diferentes tipos de dados, como datas ou valores monetários.

Minha ideia inicial para criar isso este campos é armazenado em uma tabela de banco de dados (por exemplo: meta_fields), o nome, o valor e as validações desse campo.

Depois do tempo de uso no aplicativo, pretendo estender os métodos AR __get e __set para usar o campo de nome como atributo.

Exemplo:

Se na minha mesa meta_fields eu tenho esses valores:

----------------------------------------------------
| id | name     | value      | validation          |
----------------------------------------------------
| 1  | money_en | $562,00    | some validation...  |
----------------------------------------------------
| 2  | date_crt | 2010-12-09 | some validation...  |
----------------------------------------------------

Eu pretendo usar em meus pontos de vista e controladores como ele:

$model->money_en //will return $562,00

Agora as perguntas são:

1 - Como posso usar esse tipo de campos para armazenar valores e recuperá -lo? 2 - Como posso usar diferentes tipos de validação para esses campos? Desde que eu guardo a matriz de validações como um valores serializados no banco de dados?

Obrigado.

Foi útil?

Solução

Talvez você deva olhar para um Eav implementação? Alguém criou um comportamento de eav para yii no yiiext, aqui (Eu não usei). O EAV é complicado e (geralmente) um pouco ineficiente (muitas junções!), Mas é o caminho a seguir se você quiser ter um número arbitrário e tipo de campos conectados a uma "linha" de dB.

Outras dicas

Basicamente, o que você precisa realizar aqui é uma classe base de ActiveRecord personalizada. Se você olhar para o CactiveRecord, verá que ele recupera todos os tipos de meta -informações do seu banco de dados de escolha. Como no seu caso, a meta informação está em uma tabela, você precisaria criar uma classe base do ActiveRecord personalizada que lida com o que o CactiveRecord faz.

Observe que, com uma meta tabela personalizada, como a que você descreve acima, não será fácil fazer operações normais de pesquisa e grupos.

Não seria mais fácil para você se você usar uma tabela simples com ID e valor onde o valor contém dados JSON?

-------------------------------------------------------------------------
| ID | VALUE                                                            |
-------------------------------------------------------------------------
| 10 | {'name':'validation','money_en':'$100','dare_crt' :'2010-12-09'} |
-------------------------------------------------------------------------

E então algo como:

$record = MyTable::model()->findByPk(10); // or some thing like this
$arr = CJSON::decode($record->VALUE);
$arr['money_en'] == '$200';
$receord->VALUE = CJSON::encode($arr);
$record->save();

Dê uma olhada nesta extensão. Tem implementação do que você precisa para campos de perfil.http://www.yiiframework.com/extension/yii-user-management

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top