pokok
(Pokok1)
February 8, 2012, 10:42am
1
in una CDetailView stampo il nome di un fornitore recuperandolo dalla tabella di riferimento
...
array(
'name'=>'fornitoreId',
'value'=>$model->relFornitore->nome
),
...
In alcuni record il fornitore potrebbe non essere assegnato
se ciò avviene, il codice sopra restituisce NULL e invecie di non stampare nulla
mi da errore: "Trying to get property of non-object"
Ho provato ad aggiungere questo attributo ma da errore lo stesso
'visible'=>$model->relFornitore->nome == null ? false : true,
PS nel caso servisse, le mie tabelle sono innodb
Grazie
sensorario
(Sensorario)
February 8, 2012, 12:44pm
2
In casi come questi, prima di utilizzare una relazione che potrebbe non esistere, io la creerei al volo. Un esempio di quello che ti ho detto potrebbe essere:
if(!is_object($model->relFornitore)) {
$fornitore = new Fornitore();
$fornitore->save(false);
$model->idfornitore = $fornitore->id;
$model->save();
}
E’ solo un esempio. Infatti non so come funziona la clase Fornitore, quindi ci ho messo un ->save(false); che by-passa i controlli sui campi. Senza quel false il record non verrebbe salvato. Però occhio: usare la save in questo modo non è sicuro: avremmo un record rinchiuso in una scatola nera. Quando farai riferimento a quel record potrebbero esserci dei dati non desiderati. Una buona soluzione, potrebbe essere quella di migliorare il codice in questo modo:
if(!is_object($model->relFornitore)) {
$fornitore = new Fornitore();
$fornitore->campo1 = valore1;
$fornitore->campo ... = ...;
$fornitore->campoN = valoreN;
$fornitore->save(false);
$model->idfornitore = $fornitore->id;
$model->save();
}
pokok
(Pokok1)
February 8, 2012, 1:18pm
3
sensorario:
In casi come questi, prima di utilizzare una relazione che potrebbe non esistere, io la creerei al volo. Un esempio di quello che ti ho detto potrebbe essere:
if(!is_object($model->relFornitore)) {
$fornitore = new Fornitore();
$fornitore->save(false);
$model->idfornitore = $fornitore->id;
$model->save();
}
E’ solo un esempio. Infatti non so come funziona la clase Fornitore, quindi ci ho messo un ->save(false); che by-passa i controlli sui campi. Senza quel false il record non verrebbe salvato. Però occhio: usare la save in questo modo non è sicuro: avremmo un record rinchiuso in una scatola nera. Quando farai riferimento a quel record potrebbero esserci dei dati non desiderati. Una buona soluzione, potrebbe essere quella di migliorare il codice in questo modo:
if(!is_object($model->relFornitore)) {
$fornitore = new Fornitore();
$fornitore->campo1 = valore1;
$fornitore->campo ... = ...;
$fornitore->campoN = valoreN;
$fornitore->save(false);
$model->idfornitore = $fornitore->id;
$model->save();
}
Grazie sensorario, ammetto la mia totale ignoranza perché dalla tua risposta non ho capito nulla.
In ogni caso qualcosa ho preso e sembra funzionare, spero che sia l’approccio corretto:
array(
'name'=>'fornitoreId',
'value'=>!is_object($model->relFornitore) ? '' : $model->relFornitore->nome
),
Se hai voglia di darmi conferma te ne sarei grato
sensorario
(Sensorario)
February 8, 2012, 2:24pm
4
No no =) va benissimo anche quello che hai fatto. Anzi, mi sa che va meglio =).