Проблема с HAS_MANY

Есть 2 модели, модель людей(Person) и модель их телефонов(PhonePerson).




<?php

class Person extends CActiveRecord 

{

    public static function model($className=__CLASS__)

    {

        return parent::model($className);

    }


    public function tableName()

    {

        return 'addressBook';

    }


    public function relations()

    {

        return array(

            'phones'=>array(self::HAS_MANY,'PhonePerson','user_id'),

        );

    }

}

?>






<?php

class PhonePerson extends CActiveRecord

{

    public static function model($className=__CLASS__)

    {

        return parent::model($className);

    }


    public function tableName()

    {

        return 'phone_numbers';

    }

}

?>



И есть данный код в контроллере




$model = Person::model()->findByPk('689');

echo count($model->phones);



который говорит, что количество телефонов равно 1.

хотя MySQL, если его спрашивать, выдает другое

И вторая проблема, которая связанна с этой. При выборке нескольких человек оно у всех выводит один и тот же телефон, наприме код:




$persons = Person::model()->with('phones')->findAll('`org_id` = :id', array('id'=>$model->id));

foreach ($persons as $person){

    echo $person->id . "<br>";

    foreach ($person->phones AS $phone){

        echo "phone: " . $phone->id . "<br>";

    }

}



выводит

Версия Yii 1.1.4. В другой модели отношение HAS_MANY работает нормально. Подскажите куда копать?

Укажи в конфиге логировать запросы, и посмотри, какие запросы формируются.

Нужно добавить (если нету) в components:




'log'=>array(

	'class'=>'CLogRouter',

	'routes'=>array(

		array(

			'class'=>'CWebLogRoute',

			'levels' => 'trace, info, profile, warning, error',

			'categories'=>'system.db.CDbCommand',

			'showInFireBug' => true,

		),

		array(

			'class'=>'CFileLogRoute',

			'levels' => 'trace, info, profile, warning, error',

			'categories'=>'system.db.CDbCommand',

		),

	),

),



Где CFileLogRoute - логирование в файл, а CWebLogRoute - логирование в консоль фаербага (если у тебя фаерфокс с плагином Firebug). categories - это что логировать.

P.S. если юзаешь аякс, то CWebLogRoute лучше отключить, т.к. пришедшие данные будут смешаны с данными для консоли фаербага.

Подробнее

При выполнении кода




$model = Person::model()->with('phones')->findByPk('689');

echo count($model->phones);



в профайлере получается следующий запрос

При выполнении этого запроса напрямую в MySQL, тот возвращает 4 строки(по количеству телефонов). count($model->phones) все так-же возвращает 1.

Решено. Проблема возникла из-за того, что в таблице, за которую отвечает PhonePerson не было primary_key. А поле id было просто key.

Всем спасибо.

интересное поведение актив рекорда…

Столкнулся с аналогичной проблемой.

Лечится если в таблице добавить хотябы один primary или UNIQUE ключ (в моём случае он составной).

Похоже на баг. Будем благодарны если иностаранноговорящие коллеги сообщат разработчикам.