Creare colonne active records in runtime

Ciao a tutti,

dopo aver cercato in giro per il forum e non aver trovato all’apparenza nulla di adatto alla soluzione del problema che devo affrontare mi sono deciso a scrivere un nuovo post.

La domanda che vi faccio è la seguente: è possibile utilizzare all’interno di una query sql (nello specifico, all’interno della proprietà condition di CdbCriteria) il nome di una colonna che non ha corrispondenze nella tabella mySql sulla quale effettuo la query mentre esiste nell’Active Record corrispondente (all’interno del quale è dichiarata come proprietà public)?

In caso affermativo come si fa?

Come postilla devo aggiungere che: il problema si pone perchè al momento non mi è consentito utilizzare relazioni tra tabelle, altrimenti la soluzione sarebbe ovvia; in secondo luogo, il campo che mi interessa viene popolato dopo che è stata effettuata la query con nomeActiveRecord::model()->findAll($criteria).

Grazie in anticipo per il vostro aiuto,

Cristian

Non e possibile… ed e logico se ci pensi… perche la query la esegue il database che non ne sa niente dell tuo ActiveRecord

Perche non puoi usare le relazioni?

Se ci dai piu informazioni del tippo che valore ti server e dove si trova… forse troviamo una soluzione…

P.S. Benvenuto nel forum :)

…innanzitutto grazie per la risposta e per il benvenuto nel forum :D

Per quanto riguarda le relazioni: non le posso usare perchè in fase di progettazione mi è stato detto che non era opportuno crearne.Credo si possa evincere dal DESCRIBE delle tabelle in questione:




Sim:

+---------------------------+--------------+------+-----+---------+----------------+

| Field                     | Type         | Null | Key | Default | Extra          |

+---------------------------+--------------+------+-----+---------+----------------+

| id                        | int(11)      | NO   | PRI | NULL    | auto_increment | 

| numero                    | varchar(20)  | NO   |     | NULL    |                | 

| ip                        | varchar(15)  | YES  |     | NULL    |                | 

| intestatario              | varchar(30)  | YES  |     | NULL    |                | 

| indirizzo                 | varchar(128) | YES  |     | NULL    |                | 

| profilo_rete              | int(11)      | YES  |     | NULL    |                | 

| azienda                   | int(11)      | NO   |     | NULL    |                | 

| cellulare                 | varchar(128) | NO   |     | NULL    |                | 

| codage                    | int(11)      | NO   |     | NULL    |                | 

| profilotraffico           | int(11)      | YES  |     | NULL    |                | 

+---------------------------+--------------+------+-----+---------+----------------+


elencoProfiliTemporanei:

+--------------------------+-------------+------+-----+---------+----------------+

| Field                    | Type        | Null | Key | Default | Extra          |

+--------------------------+-------------+------+-----+---------+----------------+

| id                       | int(11)     | NO   | PRI | NULL    | auto_increment | 

| idProfilo                | int(11)     | NO   |     | NULL    |                | 

| tipo                     | varchar(1)  | YES  |     | S       |                | 

| dataCreazione            | datetime    | YES  |     | NULL    |                | 

| dataInizio               | date        | YES  |     | NULL    |                | 

| durataMesi               | int(11)     | NO   |     | NULL    |                | 

| idSim                    | int(11)     | YES  |     | NULL    |                | 

| numero                   | varchar(20) | YES  |     | NULL    |                | 

| intestatario             | varchar(30) | YES  |     | NULL    |                | 

| idAzienda                | int(11)     | YES  |     | NULL    |                | 

| nomeAzienda              | varchar(30) | YES  |     | NULL    |                | 

| sogliaAvvertimento       | int(11)     | YES  |     | NULL    |                | 

| sogliaBlocco             | int(11)     | YES  |     | NULL    |                | 

| sogliaAvvertimentoEstero | int(11)     | YES  |     | NULL    |                | 

| sogliaBloccoEstero       | int(11)     | YES  |     | NULL    |                | 

+--------------------------+-------------+------+-----+---------+----------------+



Che cosa fa l’applicazione: gestisce il traffico dati delle sim di dispositivi mobili bloccandolo se supera una certa soglia. Al momento sto implemendando la possibilità di creare dei profili di traffico temporanei (validità temporanea limitata e specificata dall’utente) che permettono di aumentare le soglie di traffico stabilite di default.

A questo punto è sorta l’esigenza di far “filtrare” od ordinare agli utenti le sim sulla base della presenza o meno di un profilo di traffico temporaneo impostato (che si attiverà in futuro) oppure attivo (già in funzione), ed è qui che ho riscontrato la difficoltà di cui sopra.

Quando scrivi che mySql non ha conoscenza dell’active record hai perfettamente ragione, è logico che sia così.

Il valore che mi serve (id) si trova in nella tabella elencoProfiliTemporanei.

Di norma lo ottengo con una query che filtra i dati per dataCreazione, dataInizio e durataMesi, in modo da ottenere il profilo di traffico temporaneo attivo/impostato per una determinata Sim.

All’interno della tabella elencoProfiliTemporanei possono essere ovviamente presenti più di un profilo di traffico che in “passato” è stato associato ad una specifica sim (che viene identificata con il numero).

I profili attivi sono quelli nei quali il campo idSim non è settato a NULL.

Tipo specifica se il profilo è di una Sim = ‘S’ oppure di un’Azienda = ‘C’.

Cristian

Se ho capitto bene… tu sei nel active record “Sim” e ti serve l’id del elencoProfiliTemporanei per un datto criteria…

se non usi le relazioni (JOIN) allora devi fare un request separato… primo per prendere il record nel Sim, secondo per prendere il record nel elencoProfiliTemporanei…

Cristian… ma tu lavori in Tecnacy?

Io farei le relazioni, non sei obbligato a fare la foreign key sul database, puoi dichiararla nel model.

Questo risparmia fatica a te e richieste al database, quanto all’opportunita’ delle relazioni credo che siano decisioni che spettano a chi scrive il codice, non sono decisioni politiche.

Confermo… io non ho ancora usato/sfruttato alcun foreign key a livello di database.

E’ un peccato non usare l’integrita’ referenziale, ti da’ tanto.

Mettere on Delete cascade e’ un piacere fisico, un sacco di dettagli di cui non devi preoccuparti!

Lo so zaccaria. Lasciare al DB le cose che deve fare il DB senza stare troppo a scervellarsi su chi deve cancellare cosa quando come e perchè è assolutamente gradevole.

In verità sto lavorando ad un progetto che sfrutta questa faccenda. Però non uso Yii per quello.

:o

:P Sacrilegio !!! :rolleyes:

:lol:

Eddai =) mdomba =)!!! La logica di Yii l’ho copiata. Anche io uso i controller e le action allo stesso modo. Avendo bisogno solo di questa logica, mi sono costruito tutto quanto da me, ma si tratta di una decina di script relativamente piccoli. Non mi serviva un intero framework =). Mi perdoni ora?

Non ce niente da perdonare :D

per dire la verita ho anche io un progetto non-Yii… questo sito e attivo dal 2003 e i proprietari mi fano ordini di nuovi “feature” constantemente… il codice e scritto in PHP 4… :(

@mdomba e @sensorario, sono veramente sconvolto…

Scherzi a parte, anche io avevo dei progetti non yii (ora ho cambiato lavoro).

Uno, particolarmente divertente, il capo ha deciso che "non serve riscrivere usando un framework, ci vuole troppo tempo, riscrivetelo creandovi un vostro framework"

Secondo lui scrivere framework+sito era piu’ veloce che riscrivere il solo sito… i capi sono una maledizione del cielo contro i programmatori…

A proposito, sensorario, ti do una dritta:

Per progetti piccoli puoi usare Yiilite e includere le 3 o 4 classi che eventualmente ti servono. Io uso questo sgamo quando il cliente si lamenta se vede troppi file, come quelli che pensano che il sito glie lo fai pagare in chili.

Cosi’ puoi usare una versione ridotta del framework includendo poche classi, Yiilite include urlManager, model controller, view, in sostanza quasi tutto quello che serve.

Puoi usare una applicazione yii solo per alcune parti di un sito, se dai una occhiata alle wiki a proposito di wordpress e joomla, ci sono diversi trucchetti per fare questo.

In sostanza, puoi usare Yii (o almeno un bel pezzettone di yii) in una parte di un sito, includendo pochissimi file (e, soprattutto, senza farsi beccare dal capo)