Yii Framework Forum: Query Su Due Tabelle - Yii Framework Forum

Jump to content

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

Query Su Due Tabelle Rate Topic: -----

#1 User is offline   ilovephp 

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

Posted 03 May 2013 - 05:42 AM

Ciao ragazzi,

ho un problema sulla visualizzazione due dati provenienti da una "LEFT OUTER JOIN".
mi spiego meglio.

ho una tabella anagrafica e una smi

devo recuperare tutti i campi della prima e i campi della seconda se esistono

allora... ho pensato di agire sul model in questa maniera :
	public function searchsmi()
	{
		$criteria=new CDbCriteria;
		$criteria->select = "t.codicefiscale, t.nome, t.datadinascita, t.cognome, t.dataultimasmi AS dataultimasmi, t.id_anagrafica,  smi.idsmi as idsmi, [b]smi.datainvito as datainvito[/b] ";
		$criteria->join = 'LEFT OUTER JOIN smi ON t.id_anagrafica = smi.idanagrafica';		
		$criteria->order='idsmi DESC';		

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		'pagination' => array(  'pageSize'=>Yii::app()->user->getState('pageSize',Yii::app()->params['defaultPageSize']),),		
		
		));
	}


nel view ho :


	<?php
	$this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'anagrafica-grid',
	'dataProvider'=>$model->searchsmi(),
	'filter'=>$model,

	'columns'=>array(
		'id_anagrafica',
		'cognome',
		'nome',
		'codicefiscale',
		'dataultimasmi',
		'idsmi',
		array(
          	'header'=>'Eta\'',    
                'value'=>' datediff("A", date("j-m-Y",strtotime($data->datadinascita)), date("d-m-Y"))',
		),
		)

));

?>


ora...

idsmi che si trova nella 'seconda' tabella lo visualizzo correttamente,
invece non riesco a visualizzare 'datainvito' nella view

manca qualcosa?
la non conoscenza è una brutta bestia
0

#2 User is offline   Fabrizio Caldarelli 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 283
  • Joined: 21-March 13
  • Location:Rome, Italy

Posted 03 May 2013 - 09:35 AM

Nel senso che ti da errore e non ti visualizza il valore?
0

#3 User is offline   ilovephp 

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

Posted 04 May 2013 - 01:30 AM

View PostFabrizio Caldarelli, on 03 May 2013 - 09:35 AM, said:

Nel senso che ti da errore e non ti visualizza il valore?


se inserisco nel view
'datainvito'
mi dice che la proprietà anagrafica.datainvito non esiste.

ho provato ad eseguire la query direttamante su phpmyadmin e funziona correttamente visualizzando anche il campo datainvito.

la cosa che risulta strana è come mai il campo 'idsmi' viene visualizzato correttamente.
la non conoscenza è una brutta bestia
0

#4 User is offline   st4nny 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 325
  • Joined: 10-April 12

Posted 04 May 2013 - 07:52 AM

come mai ci metti questo nella query? (intendo b e /B)
[b]smi.datainvito as datainvito[/b]


nella Gridview hai provato sia con anagrafica.datainvito che datainvito?

hai provato a metterci un public $datainvito nel model?
0

#5 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 05 May 2013 - 10:29 PM

View Postst4nny, on 04 May 2013 - 07:52 AM, said:

come mai ci metti questo nella query? (intendo b e /B)
[b]smi.datainvito as datainvito[/b]


nella Gridview hai provato sia con anagrafica.datainvito che datainvito?

hai provato a metterci un public $datainvito nel model?



Io credo si tratti di formattazione del codice. In verità credo volesse solo mettere in evidenza quella parte di query. Se non fosse stato codice, lo avresti visto così "smi.datainvito as datainvito" ovvero bold.
0

#6 User is offline   ilovephp 

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

Posted 06 May 2013 - 01:42 AM

View Postst4nny, on 04 May 2013 - 07:52 AM, said:

come mai ci metti questo nella query? (intendo b e /B)
[b]smi.datainvito as datainvito[/b]


nella Gridview hai provato sia con anagrafica.datainvito che datainvito?

hai provato a metterci un public $datainvito nel model?



scusate ragazzi!!! era solo per mettere in evidenza, ma naturalmente non era incluso nel codice.
la non conoscenza è una brutta bestia
0

#7 User is offline   ilovephp 

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

Posted 06 May 2013 - 01:47 AM

ho una bella notizia.

ho aggiunto nel model di anagrafica
public $datainvito;


e ora tutto funziona correttamente.

anche se non mi è del tutto chiaro. qualcuno mi illumina?

grazie mille
la non conoscenza è una brutta bestia
0

#8 User is offline   st4nny 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 325
  • Joined: 10-April 12

Posted 06 May 2013 - 05:33 AM

datainvito non è un attributo del Model principale,
smi.datainvito non ti avrebbe dato nessun problema con una relazione impostata nel model principale.

Visto che nel Criteria hai creato la query a mano e quindi il campo ti arrivava come se fosse del model Anagrafica, e immagino che il metodo searchsmi era di Anagrafica, non esisteva nessun attributo datainvito a cui affidare il valore.

Piccola domanda al volo.. come mai non hai usato il metodo canonico di yii, di settare la relazione smi
e di recuperare la gridview che ti serviva tramite search()?
0

#9 User is offline   ilovephp 

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

Posted 06 May 2013 - 07:34 AM

View Postst4nny, on 06 May 2013 - 05:33 AM, said:

datainvito non è un attributo del Model principale,
smi.datainvito non ti avrebbe dato nessun problema con una relazione impostata nel model principale.

Visto che nel Criteria hai creato la query a mano e quindi il campo ti arrivava come se fosse del model Anagrafica, e immagino che il metodo searchsmi era di Anagrafica, non esisteva nessun attributo datainvito a cui affidare il valore.

Piccola domanda al volo.. come mai non hai usato il metodo canonico di yii, di settare la relazione smi
e di recuperare la gridview che ti serviva tramite search()?


grazie mille, sei molto bravo.

e io un po' meno ma vediamo se riesco a risponderti in maniera corretta. :unsure:


le due tabelle, anagrafica e smi sono legate da una relazione uno->uno, il mio obiettivo è quello di avere una query con tutti i record della prima e qualora ci fossero gli elementi della seconda. Ecco perchè la LEFT OUTER JOIN
		$criteria->join = 'LEFT OUTER JOIN smi ON t.id_anagrafica = smi.idanagrafica';	
l'ho scritta "ad hoc".

o avrei dovuto agire sul model di smi

	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(
			
			'idanagrafica0' => array(self::BELONGS_TO, 'Anagrafica', 'idanagrafica'),
			
		);
	}

la non conoscenza è una brutta bestia
0

#10 User is offline   st4nny 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 325
  • Joined: 10-April 12

Posted 06 May 2013 - 08:03 AM

ma si figurati.. ci son solo capitato prima di te ;)

io nel model Anagrafica avrei impostato:
  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(
                 //relazione 1 a 1 su Model Smi dove anagrafica_id rappresenta la chiave esterna in Smi riferita alla pk di Anagrafica (di solito l'id) se le tabelle le hai organizzate in questa maniera
                     'smi' => array(self::HAS_ONE, 'Smi', 'anagrafica_id'),
                     
                );
        }

nel metodo search()
public function search()
	{
		$criteria=new CDbCriteria;
		
		$criteria->with = array('smi');
...
}


nella gridview:
oltre agli altri campi: smi.datainvito,
e in particolare se non vuoi avere errori se datainvito o la relazione non esiste
array(
    'name'=>'data_invito',
    'value'=>'(isset($data->smi))?$data->smi->datainvito:"Nessun Valore"',
),


e impostaci un public $data_invito nel model Anagrafica, ti servirà anche nel caso in cui tu volessi filtrare e ordinare il campo
1

#11 User is offline   ilovephp 

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

Posted 07 May 2013 - 01:49 AM

View Postst4nny, on 06 May 2013 - 08:03 AM, said:

ma si figurati.. ci son solo capitato prima di te ;)

io nel model Anagrafica avrei impostato:
  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(
                 //relazione 1 a 1 su Model Smi dove anagrafica_id rappresenta la chiave esterna in Smi riferita alla pk di Anagrafica (di solito l'id) se le tabelle le hai organizzate in questa maniera
                     'smi' => array(self::HAS_ONE, 'Smi', 'anagrafica_id'),
                     
                );
        }

nel metodo search()
public function search()
	{
		$criteria=new CDbCriteria;
		
		$criteria->with = array('smi');
...
}


nella gridview:
oltre agli altri campi: smi.datainvito,
e in particolare se non vuoi avere errori se datainvito o la relazione non esiste
array(
    'name'=>'data_invito',
    'value'=>'(isset($data->smi))?$data->smi->datainvito:"Nessun Valore"',
),


e impostaci un public $data_invito nel model Anagrafica, ti servirà anche nel caso in cui tu volessi filtrare e ordinare il campo



grazie mille spero che un giorno potro' ringraziarti dell'aiuto.

funziona tutto e bene
la non conoscenza è una brutta bestia
0

#12 User is offline   ilovephp 

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

Posted 07 May 2013 - 03:42 AM

View Postilovephp, on 07 May 2013 - 01:49 AM, said:

public function search()
{
$criteria=new CDbCriteria;

$criteria->with = array('smi');
...
}



scusa ancora.

hai idea perchè non funzionano i filtri ?

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


o provato anche a scrivere
		$criteria->compare('t.cognome',$this->cognome,true);	


il risultato della query è:
	
SELECT `t`.`id_anagrafica` AS `t0_c0`, `t`.`cognome` AS `t0_c3`, `t`.`nome` AS `t0_c4`, `t`.`sesso` AS `t0_c5`, `t`.`datadinascita` AS `t0_c7`, `t`.`codicefiscale` AS `t0_c8`, `t`.`luogo_di_nascita` AS `t0_c9`, `t`.`unita_operativa` AS `t0_c10`, `t`.`indirizzo` AS `t0_c12`, `t`.`residenza` AS `t0_c13`, `t`.`telefono` AS `t0_c14`, `t`.`note` AS `t0_c21`,  `t`.`note_particolari` AS `t0_c23`, `t`.`mail` AS `t0_c26`, `t`.`idsmi` AS `t0_c27`,  `idsmi0`.`idsmi` AS `t1_c0`, `idsmi0`.`idanagrafica` AS `t1_c1`, `idsmi0`.`datainvito` AS `t1_c3` FROM `anagrafica` `t` LEFT OUTER JOIN `smi` `idsmi0` ON (`idsmi0`.`idanagrafica`=`t`.`id_anagrafica`) ORDER BY dataultimasmi DESC LIMIT 15


e da qui non si vede nessuna clausola where. E' normale ?
la non conoscenza è una brutta bestia
0

#13 User is offline   ilovephp 

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

Posted 07 May 2013 - 06:53 AM

cosi funziona.
$criteria->compare('cognome','ING',true);



se metto la variabile no

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

la non conoscenza è una brutta bestia
0

#14 User is offline   st4nny 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 325
  • Joined: 10-April 12

Posted 07 May 2013 - 07:20 AM

controlla di avare nelle rules di Anagrafica

..
array('cognome', 'safe', 'on'=>'search')
..

0

#15 User is offline   ilovephp 

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

Posted 08 May 2013 - 03:18 AM

View Postst4nny, on 07 May 2013 - 07:20 AM, said:

controlla di avare nelle rules di Anagrafica

..
array('cognome', 'safe', 'on'=>'search')
..



risolto ;D

nel controller, dovevo "riempire" il model con l'array $_POST e non $_GET

		if(isset($_POST['Anagrafica']))
			$model->attributes=$_POST['Anagrafica'];


:) thanks !
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