Relazioni interne Gestione delle relazioni interne
#1
Posted 26 May 2011 - 07:46 AM
ho una tabella chiamata tab1 al suo interno i campi id,label,id_parent e il relativo model.
Mediante il widget 'CDetailView' sto visualizzando i dati di questa tabella.
il problema è il seguente:
invece di id_parent voglio visualizzare nel componente il campo label associato
se utilizzo una chiave interna , quindi id_parent collegata ad id, si genera un loop infinito quando il widget estrae l'active record.
Avete qualche soluzione?
#2
Posted 26 May 2011 - 09:20 AM
Modifica il file della view con il CDetailView in questo modo:
$this->widget('zii.widgets.CDetailView', array(
'data'=>$model,
'attributes'=>array(
'id',
'label',
array(
'label'=>'parent ID',
'type'=>'raw',
'value'=>Tab1::Model()->findByPk($model->parent_id)->label,
),
),
));
Spero che vada bene.
#3
Posted 28 May 2011 - 10:51 AM
dchan, on 26 May 2011 - 09:20 AM, said:
Modifica il file della view con il CDetailView in questo modo:
$this->widget('zii.widgets.CDetailView', array(
'data'=>$model,
'attributes'=>array(
'id',
'label',
array(
'label'=>'parent ID',
'type'=>'raw',
'value'=>Tab1::Model()->findByPk($model->parent_id)->label,
),
),
));
Spero che vada bene.
In questo caso però non vai a fare una query per ogni riga presente? Non c'è qualche modo più performante?
#4
Posted 30 May 2011 - 01:28 AM
Usa una relazione has one, e fai la query con Tab1::model()->with('parent')->findAll();
Funziona. Se anche avessi 2 record che si puntano a vicenda, la query estrae solo il primo livello di parentela e non va oltre.
#5
Posted 30 May 2011 - 02:33 AM
non funziona. quando il campo id_parent è settato a 0, quindi mi genera un errore
Trying to get property of non-object
@zaccaria
ok penso di aver capito cosa intendi ci provo e ti faccio sapere
#6
Posted 30 May 2011 - 02:51 AM
Ciro, on 30 May 2011 - 02:33 AM, said:
non funziona. quando il campo id_parent è settato a 0, quindi mi genera un errore
Trying to get property of non-object
@zaccaria
ok penso di aver capito cosa intendi ci provo e ti faccio sapere
ok non funziona. quando id_parent = 0 , quindi non è collegato a niente , mi genera come errore
Trying to get property of non-object
#7
Posted 30 May 2011 - 03:30 AM
Ciro, on 30 May 2011 - 02:51 AM, said:
Trying to get property of non-object
al momento ho risolto definendo un metodo statico all'interno del mio model. Un metodo di questo tipo
static function findParent($idParent)
{
$criteria = new CDbCriteria();
$criteria->condition = "id_menu=$idParent";
$rec = Menu::model()->find($criteria);
if(!empty($rec->label))
return($rec->label);
else
return "";
}
grazie a tutti
#8
Posted 30 May 2011 - 07:39 AM
function findParent()
{
$criteria = new CDbCriteria();
$criteria->condition = "id_menu=$this->id_parent";
$rec = Menu::model()->find($criteria);
if(!empty($rec->label))
return($rec->label);
else
return "";
}e poi non ti serve fare queste cose, basta che imposti la relazione
'parent' => array(self::BELONGS_TO, 'Menu', 'parent_id'),
e puoi chiamare il parent con:
$this->parent
Inoltre e' normale che dia eccezione se non c'e' il record, puoi risolvere cosi':
'value'=>($this->parent)?$this->parent->label:''
Le relations sono un po' ostiche all'inizio, dai retta a me: imposta le foreign key correttamente del database e lascia a Gii il compito di generare le relations, vedrai che diventa tutto molto piu' abbordabile.
#9
Posted 08 June 2011 - 10:53 AM
alla fine ho fatto pratica con le relazioni.
grazie per la risposta.
#10
Posted 09 June 2011 - 06:47 AM
zaccaria, on 30 May 2011 - 07:39 AM, said:
function findParent()
{
$criteria = new CDbCriteria();
$criteria->condition = "id_menu=$this->id_parent";
$rec = Menu::model()->find($criteria);
if(!empty($rec->label))
return($rec->label);
else
return "";
}e poi non ti serve fare queste cose, basta che imposti la relazione
'parent' => array(self::BELONGS_TO, 'Menu', 'parent_id'),
e puoi chiamare il parent con:
$this->parent
Inoltre e' normale che dia eccezione se non c'e' il record, puoi risolvere cosi':
'value'=>($this->parent)?$this->parent->label:''
Le relations sono un po' ostiche all'inizio, dai retta a me: imposta le foreign key correttamente del database e lascia a Gii il compito di generare le relations, vedrai che diventa tutto molto piu' abbordabile.
lode a zaccaria

Help












