ORM

Salve, sono nuovo di yii. Ho fatto molte cose in J2EE ultimamente.

La domanda è questa, in ambiente JPA, nelle entity io relazionavo gli attributi e eseguendo una ricerca ottenevo una struttura completa. Mi spiego con esempio molto semplice:

Tabella Proprietari e tabella Auto(con proprietario_id che punta al proprietario). Nella entity proprietario ha una collection di auto (con reference ad Auto).

Naturalmente a fronte di una ricerca per esempio, su un proprietario, l’oggetto risultante inglobbava anche la collection di auto da lui possedute(gli oggetti auto).

Mi sembra di capire che con yii siano le “relations”, ma non capisco come scrivere le ricerche senza l’uso di JOIN.

Spero di essere stato chiaro.

Saluti

Fabio

Chiarissimo. Faccio un esempio: il più banale che mi viene in mente. Quello di una chiave esterna uno a molti. Con le JPA (con Java) o in Doctrine2 (in pratica le JPA per php) avresti, se dico bene, una @OneToMany.

Bene, supponiamo tu abbia appena fatto una query che ti restituisce un record. Magari perché lo hai cercato attraverso chiave primaria. Supponiamo che il model cui fa riferimento questo record abbia una relazione ad un altro model. Per accedere ad un attributo di quel model, dovrai fare questo:


$risultato->relazione->attributo;

In pratica $oggetto->NOME_DELLA_RELAZIONE ti restituisce l’oggetto puntato da quella relazione. Siamo in Yii, e nell’esempio che ti ho appena fatto la relazione deve essere di tipo BELONGS_TO.

Ok, in questi giorni di assenza ho fatto passi avanti. Ho un problema legato alla situazione appena descritta.

Un oggetto(cercato in qualche modo) che contiene un vettore di oggetti (relations). Io vorrei nella view mostrare i dati dell’oggetto e la tabella contenente il vettori di oggetti associati usando CGridView e i suoi oggetti di ricerca/filtro.

Ho provato:


$this->widget('zii.widgets.grid.CGridView', array(

        'id' => 'evento-grid1',

        'dataProvider' => $model->eventos->search(),

        'filter' =>$model->eventos,

        'columns' => array(

            'estratto',

            'data',

        ),

    ));

con il seguente codice nel model padre


$criteria=new CDbCriteria;


		$criteria->compare('id',$this->id);

		$criteria->compare('nome',$this->nome,true);

		$criteria->compare('data',$this->data,true);

		$criteria->compare('descrizione',$this->descrizione,true);

                

                $criteria->together = true;

                $criteria->with=array('eventos');

                

		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

Errore ricevuto:

Fatal error: Call to a member function search() on a non-object in I:\xampp\htdocs\php\yii\testYii\protected\views\progetto\view.php on line 48 “‘dataProvider’ => $model->eventos->search(),

Ciao e grazie

Fabio