foreach danych z kilku modeli

Witam

Mam problem z wyświetleniem danych z kilku modeli relacje wyglądają tak:

Model1:




public function relations()

    {

        return array(

            'modelData2' => array(self::HAS_MANY, 'Model2', 'id'),

            'modelData3' => array(self::HAS_ONE, 'Model3', 'id')

        );

    }



Dalej pobieram dane wszystko jest ok, zgadza się liczba wierszy pobranych:




$criteria = new CDbCriteria();

$criteria->with = array(

     'modelData2',

     'modelData3'

);

$model = Model1::model()->findAll($criteria);



problem jest jak już chcę wyświetlać dane:




foreach ($model as $mod) {

   echo $mod->name;

   echo $mod->modelData2->name;

   echo $mod->modelData3->name;

}



Wyskakuje mi błąd trying to get property of non object

Z góry dziękuję za pomoc

Wygląda mi na to, że nieprawidłowo zdefiniowany jest jeden lub dwa klucze obce w relacji. Przez to $mod->modelData2 lub $mod->modelData3 nie zwraca obiektu.

Na pewno masz literówkę, powinno być "self::HAS_ONE" zamiast "self::HAS ONE". Zresztą całość wygląda dość podejrzanie, np pewno robiłeś to wg dokumentacji?

już poprawiłem tu tą literówkę ale w kodzie głównym miałem dobrze

Spróbuj dla testu zakomentować pojedyncze odwołania i sprawdzić czy problem jest tylko z jedną relacją, czy z obiema.

Przy relacjach typu HAS_MANY i HAS_ONE w trzecim parametrze podajesz nazwę kolumny, która przechowuje informacje o kluczu obcym w modelu, do którego chcesz utworzyć relację (czyli Model2 i Model2). zwykle nie jest to ‘id’ tylko coś w stylu ‘model1_id’.

komentowałem już wcześniej i mam jeszcze belongs to ale to z kolei działa ok a HAS_ONE i HAS_MANY już nie.

Z kolei jeśli chodzi o trzeci parametr w relacjach has one i has many to w jednym mam model1_id natomiast w drugim id bo jest jako klucz główny jednej tabeli i jednocześnie kluczem obcym do drugiej

Relacja HAS_MANY zwraca nie obiekt a tablicę obiektów, powinieneś więc odwoływać do nich po indeksie, np


$mod->modelData2[0]->name

albo najlepiej przeglądać foreachem.

Co do HAS_ONE to prawdopodobnie masz jakieś niespójności w bazie i dla któregoś obiektu typu Model1 nie ma pasującego obiektu typu Model3. Przed wyświetleniem nazwy obiektu sprawdzaj czy on w ogóle istnieje i zobacz czy któregoś nie brakuje.