Se valore relazionato è NULL mi da errore

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

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

No no =) va benissimo anche quello che hai fatto. Anzi, mi sa che va meglio =).