Nome dinamico di una tabella

Ho un problema con il nome di una tabella che deve poter cambiare in quando devo/voglio mantenere separati alcuni rilevamenti di anno in anno.

Il nome della tabella viene recuperato dal campo tableName. Ho un database che deve essere diviso di anno in anno quindi ho pensato di aggiungere l’anno al metodo tableName del model.




  public function tableName() {

    return 'ScaricoTempi' . date('Y');

  }



Io però vorrei che fosse possibile selezionare l’anno, memorizzarlo nella session, quindi modificare al volo questo tableName. Vorrei provare con la soluzione del behavior. Non ne ho mai creato uno quindi chiedo il vostro supporto:




<?php

class CurrentYearBehavior extends CBehavior {


  public function events() {

    return array_merge(parent::events(), array(

        'onBeginRequest' => 'beginRequest',

    ));

  }


  public function beginRequest() {

    if ($this->owner->user->getState('currentYear'))

      $this->owner->currentYear = $this->owner->user->getState('currentYear');

    else

      $this->owner->currentYear = date('Y');

  }


}



Aggiungendo quel Behavior mi aspetto che ad ogni richiesta di pagina, venga caricato il parametro currentYear. E qui la domanda sorge spontanea: ho un limite di nomi, o posso inventarmi quelli che voglio? In ogni caso, andrei a recuperare questo valore al momento della richiesta dalla tabella:




  public function tableName() {

    return 'ScaricoTempi' . $this->owner->user->getState('applicationLanguage');

  }



Così avrei risolto solo mezzo problema: ora come faccio a creare una tabella che non esiste quando serve?




      CREATE TABLE IF NOT EXISTS `ScaricoTempi2011` (

            `id` int(11) NOT NULL AUTO_INCREMENT,

            `id_collaborazione` int(11) NOT NULL,

            `secondi` int(11) NOT NULL,

            `data` date NOT NULL,

            `note` text NOT NULL,

            `orascarico` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

            `id_sotto_commessa` int(11) NOT NULL,

            PRIMARY KEY (`id`)

      );



Che mi suggerite?

Per creare la tabella basta usare Yii::app()->db->createCommand("sql")->query();

Io avevo fatto un degenero del genere, ma alla fine ho deciso di fare una sola tabella con un campo anno.

Nel mio caso, pero’ avevo meno di 10 000 record per anno, per cui sono andato sul sicuro.

Corro il rischio di arrivare a 25000 record annui.

Ma se tu mi dici che mi basta fare Yii::app()->db->createCommand("sql")->query("create table … … …"); io riesco a risolvere.

Non ci siamo… allora:




class UserIdentity extends CUserIdentity {


  private $_id;

  public $anno;


  public function authenticate() {

    $username = strtolower($this->username);

    $user = Utenti::model()->find('LOWER(username)=?', array($username));

    if ($user === null) {

      $this->errorCode = self::ERROR_USERNAME_INVALID;

    } else if (!$user->validatePassword($this->password)) {

      $this->errorCode = self::ERROR_PASSWORD_INVALID;

    } else {

      $this->_id = $user->id;

      $this->username = $user->username;

      $this->errorCode = self::ERROR_NONE;

      $this->anno = $user->anno;

    }

    return $this->errorCode == self::ERROR_NONE;

  }



Ho provato ad aggiungere UserIdentity mettendo l’anno e sperando di poterlo leggere in seguito in questo modo:




Yii::app()->user->anno



Ma non è così =(. Come devo fare?

Ho rinunciato al mio behavior (peccato perchè sarebbe stata la mia prima estensione).

Così, mentre scrivevo l’ultimo post qui ho cercato nel sito di Yii ed ho trovato questo:

http://www.yiiframework.com/wiki/60/add-information-to-yii-app-user-by-extending-cwebuser/

In effetti ho trovato il modo di estendere a mio piacimento la classe CWebUser. Spero possa essere utile anche per voi.