Yii Framework Forum: Relazioni interne - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Relazioni interne Gestione delle relazioni interne Rate Topic: -----

#1 User is offline   Ciro 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 43
  • Joined: 26-May 11

Posted 26 May 2011 - 07:46 AM

Ciao ragazzi,
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?
0

#2 User is offline   dchan 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 28-March 11
  • Location:Italy

Posted 26 May 2011 - 09:20 AM

Consideriamo che il nome del tuo Model sia Tab1.
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.
1

#3 User is offline   Diegovl 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 27-February 11

Posted 28 May 2011 - 10:51 AM

View Postdchan, on 26 May 2011 - 09:20 AM, said:

Consideriamo che il nome del tuo Model sia Tab1.
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?
0

#4 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 30 May 2011 - 01:28 AM

Non ti genera un loop infinito.

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.
0

#5 User is offline   Ciro 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 43
  • Joined: 26-May 11

Posted 30 May 2011 - 02:33 AM

@dchan
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
0

#6 User is offline   Ciro 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 43
  • Joined: 26-May 11

Posted 30 May 2011 - 02:51 AM

View PostCiro, on 30 May 2011 - 02:33 AM, said:

@dchan
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
0

#7 User is offline   Ciro 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 43
  • Joined: 26-May 11

Posted 30 May 2011 - 03:30 AM

View PostCiro, on 30 May 2011 - 02:51 AM, said:

ok non funziona. quando id_parent = 0 , quindi non è collegato a niente , mi genera come errore

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
0

#8 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 30 May 2011 - 07:39 AM

non farlo statico:

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.
1

#9 User is offline   Ciro 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 43
  • Joined: 26-May 11

Posted 08 June 2011 - 10:53 AM

ciao zaccaria,
alla fine ho fatto pratica con le relazioni.

grazie per la risposta.
0

#10 User is offline   ilovephp 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 128
  • Joined: 04-February 11
  • Location:treviso

Posted 09 June 2011 - 06:47 AM

View Postzaccaria, on 30 May 2011 - 07:39 AM, said:

non farlo statico:

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
la non conoscenza è una brutta bestia
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users