Tabella Di Stato Con Relazione Many_Many: Come Visulizzare Il Timestamp Relativo?


(St4nny) #1

ho una tabella di stato composta da id,progetto_id,stato_id,createtime

nel model progetto ho impostato la relazione in questo modo:




'stato'=>array(self::MANY_MANY, 'StatoProgetto', 'tbl_stato_progetto(progetto_id, stato_id)','order'=>'createtime ASC'),



la relazione funziona, vedo correttamente i diversi stati di Progetto vorrei però poter stampare il campo createtime.

io per testare la relazione mi son scritto:




foreach($model->stato as $stato)

$stato->stato;



il problema è che in questa maniera non riesco a leggere createtime, come fare?

Grazie.


(Roccodeluca) #2

Ti consiglio di dare una lettura alla parte finale del mio post: Relazioni Many Many


(St4nny) #3

non vedo dove trovo una soluzione alla mia domanda.

nelle tue tabelle con many_many ci sono solo le chiavi esterne non ci sono altri campi.


(Sensorario) #4

Hai una relazione many to many, quindi




    foreach($model->stato as $stato) {

        $stato->stato;

    }



la variabile dentro al foreach sarà un array di riferimenti alla tabella più esterna. Devi fare un altro foreach interno.


(Roccodeluca) #5

Forse hai letto male

perché ci sono altri attributi e cmq sono due foreach innestati.

Se hai ancora problemi posta la relazione delle tbl in modo che riesca a capire meglio il tuo problema.


(St4nny) #6

allora riformulo la richiesta:

@roccodelux:

la tua many_many ha solo 2 campi(utenti_permessi) o 3 campi(tbl_ categoria prodotti con l’id), non ha altri attributi e non vedo del codice che li tira fuori dalla tabelle interessate.

@sensorario:

il problema è proprio quello, io non voglio riferirmi alla tabella più esterna ma alla tabella che ha

la relazione many_many: ogni volta che cambio stato mi salvo un timestamp mi interessa stamparlo in qualche maniera. è possibile solamente settando la relazione come indicato nel primo post nel model Progetto?




'stato'=>array(self::MANY_MANY, 'StatoProgetto', 'tbl_stato_progetto(progetto_id, stato_id)','order'=>'createtime ASC'),



la tabella tbl_stato_progetto (many_many) ha dentro di se progetto_id,stato_id,timestamp

io voglio stampare lo STATO e il timestamp, come? lo stato lo stampo già, come faccio a stampare il timestamp?


(Roccodeluca) #7

Nel model metti una relazione has-many ed hai risolto.

Partiamo dal mio esempio

nella tbl utenti_permessi ho aggiunto l’attributo vari

Nel model Utenti inserisco la relazione:





	public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

				'permessis' => array(self::MANY_MANY, 'Permessi', 'utenti_permessi(utenti_id, permessi_id)'),

				//'services' => array(self::MANY_MANY, 'Service', 'LibraryService(libraryID, serviceID)'),

				'utentipermessis'=>array(self::HAS_MANY, 'utenti_permessi', 'utenti_id'),

		);

	}




Nell’action:





public function actionHasMany()

	{

		$utenti=Utenti::model()->findAll();

		

		foreach($utenti as $utente)

		{

		

			echo $utente->nome . " sono associati n= " . count($utente->utentipermessis) . " Vari. Essi sono :<br />";

			//echo $utente->utentipermessis

			

			foreach($utente->utentipermessis as $permesso)

			{

				echo $permesso->vari . "<br />";

			}

			echo "<br />";

		

		}

		

	}








(St4nny) #8

ragazzi io ancora non ho risolto il mio problema.

nessuno di voi ha avuto l’esigenza di avere una many_many con timestamp?

la tabella è così: id | progetto_id | stato_id | createtime

è una tipica tabella di controllo degli stati… lo stato più recente è quello attuale.

sono nella situazione in cui vorrei visualizzare in una gridview: TIPO STATO | DATA

e far vedere i vari stati in cui è passato il progetto.

al momento ho impostato la relazione come segue:




'stato'=>array(self::MANY_MANY, 'StatoProgetto', 'tbl_stato_progetto(progetto_id, stato_id)','order'=>'createtime ASC'),



la relazione funziona correttamente ma in questa maniera con il foreach non riesco a visualizzare il timestamp della data di creazione.

con questo codice:




foreach($model->stato as $stato) {

        $stato->stato;

        //$stato->createtime; (è nullo)

        //anche con il foreach è nullo

    }



la tbl_stato ha: id | stato (varchar)

quindi ci sta che createtime sia nullo… perchè a quel livello non esiste.

come faccio a risolvere?


(Sensorario) #9

Domanda: ma nel database che valore hai?

PS. C’è una ragione per la quale usi andare a capo anziché usare la virgola, oppure non inizi le frasi con la maiuscola?


(St4nny) #10

Re al PS: No. Non c’è nessuna ragione. :D

Ritornando a noi:

Tabella dei Tipo di Stato




CREATE TABLE tbl_stato

(

  id serial NOT NULL,

  stato character varying(200),

  CONSTRAINT pk_tbl_stato_id PRIMARY KEY (id )

)



Tabella degli stati dei progetti:




CREATE TABLE tbl_stato_progetto

(

  id serial NOT NULL,

  progetto_id integer NOT NULL,

  stato_id integer NOT NULL,

  createtime integer NOT NULL,

  CONSTRAINT pk_id PRIMARY KEY (id ),

  CONSTRAINT tbl_stato_progetto_progetto_id_fk_tbl_progetto_id FOREIGN KEY (progetto_id)

      REFERENCES tbl_progetto (id) MATCH SIMPLE

      ON UPDATE NO ACTION ON DELETE NO ACTION,

  CONSTRAINT tbl_stato_progetto_stato_id_fk_tbl_stato_id FOREIGN KEY (stato_id)

      REFERENCES tbl_stato (id) MATCH SIMPLE

      ON UPDATE NO ACTION ON DELETE NO ACTION

)



In questa tabella degli stati, ho fatto diverse INSERT di prova:




COPY tbl_stato_progetto (id, progetto_id, stato_id, createtime) FROM stdin;

1	2	0	1261146094

3	2	1	1341495925

2	2	6	1341302442

\.



L’sql riportato viene da un pg_dump nel caso non tornasse familiare qualcosa.

Penso che ormai la richiesta sia chiara, io vorrei poter stampare in una Gridview:

Tipo di Stato associato a stato_id (cosa che già faccio con la MANY::MANY impostata),

e createtime che non riesco ancora a leggere impostando solo la relazione postata:




'stato'=>array(self::MANY_MANY, 'StatoProgetto', 'tbl_stato_progetto(progetto_id, stato_id)','order'=>'createtime ASC'),




Per ora ho impostato una HAS::MANY, e una HAS::ONE per recuperare il singolo record che rappresenta l’ultimo stato salvato.




'stato'=>array(self::HAS_MANY, 'StatoProgetto', 'progetto_id','order'=>'createtime DESC'),

'stato_attuale'=>array(self::HAS_ONE, 'StatoProgetto', 'progetto_id','order'=>'createtime DESC'),



non era quello che mi ero prefissato, ma comunque funziona. Voi che dite?


(Sensorario) #11

Se funziona va bene.


(Matteo Falsitta) #12

Grande Sensorario, mi piace la tua filosofia!

Io non sono un gran fan delle many many, preferisco fare una has many + belongs to per ottenere il risultato, se ti secca il fatto di fare troppe query usa with:


$criteria->with('stato'=>array('with'=>'nomeStato'));

In questa maniera hai una query con 2 join, esattamente la stessa cosa che avresti con la many many, la differenza e’ che nella select hai anche il tuo timestamp.


(St4nny) #13

Ho impostato come dicevate un has many + belongs.

Le mie domande continue e il tentativo di up, erano solo per capire

se fosse un mio limite nel capire la documentazione, o un limite della funzionalità.

Grazie a tutti comunque per il supporto.


(Sensorario) #14

La mia filosofia è “prima lo faccio funzionare”, poi se c’è modo, lo faccio funzionare meglio. Devo creare prima valore per il cliente che per me. Uso Yii anche per questo.