Yii中的关系装置

时间:2011-06-14 21:25:11

标签: php yii fixtures

如何在Yii中设置具有关系的灯具?例如,帖子可以有评论,如何在灯具中引用帖子ID来创建评论?

后置夹具:

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

评论夹具:

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

3 个答案:

答案 0 :(得分:5)

我不知道是否有动态方法可以做到这一点,但以下情况应该有效:

后置夹具:

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

评论夹具:

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

答案 1 :(得分:4)

据我所知,你可以使用init脚本而不是经典的灯具。 Yii documentation读取:

  

我们也可能不喜欢重置a的默认方式   表,即截断它并将其与夹具数据一起插入。如果   在这种情况下,我们可以为其编写初始化脚本   特定夹具文件。必须将脚本命名为表名   以.init.php为后缀。例如,初始化脚本   Post表格是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 :(得分:2)

我知道它已经回答了,但我认为这是一个更好的答案。 是的,您可以将动态字段用于关系:

后置夹具:

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 docs CDbFixtureManager