Реляционные светильники в Yii - PullRequest
6 голосов
/ 15 июня 2011

Как настроить светильники с отношениями в Yii? Например, к сообщениям могут быть добавлены комментарии. Как мне обратиться к идентификатору сообщения в приспособлении для создания комментариев?

Почтовое крепление:

return array(
  'post1'=>array(
    'title'=>'My title',
    'body'=>'My text',
  ), 
  ...

Комментарий фикстура:

return array(
  'comment1'=>array(
    'text'=>'Comment text...',
    'post_id'=> ???
  ), 

Ответы [ 3 ]

5 голосов
/ 15 июня 2011

Я не знаю, есть ли динамический способ сделать это, но должно работать следующее:

Постфикс:

return array(
  'post1' => array(
    'id' => 1 
    'title' => 'My title',
    'body' => 'My text',
), 

Комментарий фикстура:

return array(
  'comment1' => array(
    'text' => 'Comment text...',
    'post_id' => 1
),
4 голосов
/ 16 марта 2012

Насколько я знаю, вы можете использовать сценарии инициализации вместо классических. Документация Yii гласит:

Возможно также, что нам не нравится стандартный способ сброса таблицу, то есть, обрезая ее и вставляя ее с данными прибора. Если в этом случае мы можем написать скрипт инициализации для конкретный файл фикстуры. Сценарий должен быть назван как имя таблицы с суффиксом .init.php. Например, скрипт инициализации для Таблица сообщений будет Post.init.php. Когда CDbFixtureManager видит этот сценарий, он будет выполнять этот сценарий вместо использования по умолчанию способ сбросить таблицу.

Так что в вашем случае вместо protected/tests/fixtures/Comment.php у вас будет protected/tests/fixtures/Comment.init.php, который делает это:

// the $this variable refers to the CBdFixtureManager instance
$this->truncateTable($tableName);
$post = $this->getRecord('Post','post1'); // get dependent fixture

// define new fixture
$commentAttributes = array(
  'text' => 'Comment text...',
  'post_id' => $post->id
);
$comment = new Comment;
$comment->setAttributes($commentAttributes);
if(!$comment->save()) throw new CException('Unable to save fixture');

// add new row primary key
$pk = Comment::model()->getTableSchema()->primaryKey;
if(is_string($pk))
  $commentAttributes[$pk] = $comment->$pk;
elseif(is_array($pk))
  foreach($pk as $key)
    $commentAttributes[$key] = $comment->$key;

$this->_rows['Comment']['comment1'] = $commentAttributes;
$this->_records['Comment']['comment1'] = 'Comment';

Хотя я понимаю, что ответ очень поздний, это должно решить вашу проблему. С тех пор, как я попал сюда, я надеялся, что смогу помочь кому-то, кому нужна эта информация.

2 голосов
/ 09 сентября 2012

Я знаю, что это уже ответили, но я думаю, что это лучший ответ.Да, вы можете использовать динамические поля для отношений:

Прикрепление сообщения:

return array(
  'post1' => array(
    'title' => 'My title',
    'body' => 'My text',
), 

Прикрепление комментария:

return array(
  'comment1' => array(
    'text' => 'Comment text...',
    'post_id' => $this->getRecord('post', 'post1')->id
),

PostTest.php

public $fixtures=array(
    'post'=>'Post',
    ...
);

Yii документы CDbFixtureManager

...