Отношение Yii — внешний ключ MySQL

Таблицы в MySQL:

поле:

id pk

опция_поля

id pk

feild_id int(11)    

ALTER TABLE  `field_option` ADD CONSTRAINT  `option_field` FOREIGN KEY (  `feild_id` ) REFERENCES  `agahi_fixed`.`field` (
`id`
) ON DELETE CASCADE ON UPDATE RESTRICT;

Модель поля отношений:

return array(
  'fieldOption' => array(self::HAS_MANY, 'FieldOption', 'feild_id'),
);

Модель FieldOption отношения:

return array(
    'feild' => array(self::BELONGS_TO, 'Field', 'feild_id'),
);

В контроллере:

if(Field::model()->exists('cat_id = :catId', array(":catId"=>$_POST['catid']))){
            $criteria=new CDbCriteria;
            //$criteria->select='*';  
            $criteria->condition='cat_id=:catId';
            $criteria->params=array(':catId'=>$_POST['catid']);
            $criteria->with = 'fieldOption';
            $field=Field::model()->findAll($criteria);
            header('Content-type: application /json');
            $jsonRows=CJSON::encode($field);
            echo $jsonRows;
        }

но он не работает только с выбранными записями в таблице полей.

Почему?


person Omid Salmani    schedule 27.12.2014    source источник
comment
Ваше постоянное неправильное написание (или неортодоксальное написание) feild_id необычно — вероятно, лучше было бы field_id.   -  person Jonathan Leffler    schedule 28.12.2014


Ответы (1)


таким образом вы не достигнете того, что ищете,

когда вы извлекаете свои записи с помощью with, он будет извлекать связанные записи, что означает: eager loading не lazy, но когда вы json кодируете свою модель, он получит атрибуты вашей основной модели, а не какие-либо отношения. Если вы хотите, чтобы любые связанные данные были закодированы с помощью модель, вы должны прямо сказать об этом. Я предлагаю сделать пустой массив:

$result = array();

сделайте цикл над своей моделью и добавьте к этому результату от модели к связанной модели

foreach($field as $model)
{
  $record = $model->attributes; // get main model attributes
  foreach($model->fieldOption as $relation)
     $record['fieldOption'][] = $relation->attributes; // any related records, must be explicitly declared

  $result[] = $record;
}

теперь у вас есть именно то, что вам нужно, тогда повторите это

 echo CJSON::encode($result);
person Developerium    schedule 28.12.2014