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

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.

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

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.

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.

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.

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?

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 />";

		

		}

		

	}







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?

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?

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?

Se funziona va bene.

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.

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.

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.