Mysql Id

Boa tarde.

Estou a finalizar a estrutura da minha aplicação e há algo que me está a dificultar.

Queria no id do recibo que aparece-se da seguinte forma.

ANOID. EX 201201

Qual seria a melhor forma de o fazer?

Cumprimentos

Olá,

Nesse recibo, voce pode concatenar o ano atual com o campo ID.

:)

Sim, isso eu sei, minha dúvida está em como.

Devo criar uma função no controlador?

Se sim como deveria ser a função?

Não precisa criar função, caso queira fazer de forma rápida, se faz assim:


$id_recido = date('Y') . $model->primaryKey;

Eu recomendo adicionar essa criação concatenação no seu Model, depois de salvar o Recibo.

Exemplo:




class Recibo extends CActiveRecord {


	[...]

	

	public function beforeSave() {


        if ($this->isNewRecord) {

            $this->id_recibo = date('Y') . $this->primaryKey;

        }


        return parent::beforeSave();

    }

	

	[...]


}

Desta forma, quando um cliente ou você mesmo adicionar um novo recibo ele vai pegar o ID cadastrado, e concatena com o ano corrente e adicionar a sua tupla.

Obrigado, era exactamente essa a minha dúvida, pensei que teria que criar uma função no form para que antes de inserir a query concatena-se o ano ao id.

Cumprimentos e muito obrigado

Excelente abordagem, serve pra muitas outras situações.

Bem após experimentar em condições verifiquei que apenas adiciona o ano no banco de dados, o id não chega a ser adicionado.

alguma ideia para resolver?

Cumprimentos

Utiliza os mesmos critério, porém na seguinte função





    public function afterSave() {

        if ($this->isNewRecord) {

            $this->id_recibo = date('Y') . $this->primaryKey;

        }

        return true();

    }



Continua igual, embora na url passe o ano+id quando se clica em create, no banco de dados apenas mantém o ano.

Você definiu alguma chave primaria para a tabela?

Sim defini o id_recibo como chave primária.

Cumprimentos

Então faz assim





    public function beforeSave() {

        if ($this->isNewRecord) {

            $this->id_recibo = date('Y') . '' . $this->id_recibo;

        }

        return parent::beforeSave();

    }



Acontece exactamente o mesmo que anteriormente.

Já tentei inclusive usar o mysql_insert_id para ir buscar o ultimo id, e incrementar 1 mas nem assim funcionou.

Cumprimentos

Tentou assim também?





    public function afterSave() {

        if ($this->isNewRecord) {

            $this->id_recibo = date('Y') . '' . $this->id_recibo;

        }

        return true();

    }



Acontece o mesmo, o que é estranho.

O que me parece o seu id_recibo é um auto_increment então a melhor forma é você criar outro campo e fazer a concatenação do ID com o ano, como o Gustavo Andrade falou acima. Tenta assim





    public function beforeSave() {

        if ($this->isNewRecord) {

            $this->numero = date('Y') . ''.$this->id_recibo;

        }

        return parent::beforeSave();

    }



Já tinha tentado assim, mas mesmo assim não vai buscar o id e adicionar a bd

No sei controller, você não ta usando $model->save(false)?

Veja se consegue visualizar o ID adicionado.


public function beforeSave() {

        if ($this->isNewRecord) {

            echo '<pre>';

            print_r($this->attributes);

            echo '</pre>';

            exit();

        }

        return parent::beforeSave();

    }

Não não estou a usar.

Gerei os forms no gii extended.

Array

(

[nome_cliente] =&gt; teste


[telefone_cliente] =&gt; 34343


[morada_cliente] =&gt; asdasdas


[marca_equipamento] =&gt; blaaa


[nr_serie] =&gt; 2132313131


[avaria] =&gt; asdasdas


[data_recb] =&gt; 2013-01-26


[data_entrega] =&gt; 2013-01-17


[garantia] =&gt; Sim


[preco] =&gt; 1231


[observacoes] =&gt; asdasda


[modelo_equipamento] =&gt; blaaa


[estado] =&gt; Recebido


[id_recibo] =&gt; 


[id_ficha] =&gt; 

)

Posta seu model, acho que falta a variável na

function rules() {…array(‘id_recibo’, ‘safe’)…}.