如何使用夹具创建循环引用?

时间:2011-01-14 13:39:06

标签: symfony1 doctrine

让我们考虑一下这个模型:

A:
  columns:
    b_id: 
      type: int
      notnull: false
  relations:
    b: B
    local: b_id
    foreignAlias: as


B:
  columns:
    a_id: 
      type: int
      notnull: true
  relations:
    a: A
    foreignAlias: bs

请注意,b_id可以为null。 是否可以使用一个或多个灯具创建 一个与B对象关系的对象,该对象自己引用一个对象,如果是,如何? 更通用的问题,是否可能:

  1. 创建一个A
  2. 创建一个B
  3. 更新A
  4. 或者更简单地说,是否可以使用灯具更新对象? 在汤姆的回答之后我尝试了

    greg@liche:~/project/symfony$ ./symfony  doctrine:data-load update --append
    >> doctrine  Loading data fixtures from "update"
    >> doctrine  Data was successfully loaded
    

    更新目录包含一个如下所示的夹具:

    A:
      a_fixture_identifier:
        b: b_fixture identifier
    
    加载此灯具后

    A:
      a_fixture_identifier:
    
    B:
      b_fixture_identifier:
       a: a_fixture_identifier
    

    它说更新夹具文件已成功加载,但它似乎没有更新任何内容。我无法理解第二个fixture文件如何知道初始文件中声明的fixture标识符......我可以尝试什么?

1 个答案:

答案 0 :(得分:1)

灯具用于在表格中添加一些数据,所以是的,它都是用夹具数据更新对象。

只要不违反您在架构中指定的约束,您就可以随意添加此数据。在关系的情况下,引用的值必须在引用值之前或者不能声明关系。

从单个灯具文件上传复杂灯具数据时,有时会出现这种情况。我注意到要绕过它,加载一组灯具,然后删除该文件并加载另一组灯具。换句话说,即使关系存在于单个fixture文件中,symfony / doctrine似乎也无法(至少在某些情况下)一次性加载它们。考虑“数据集”而不是完整的数据库。

我想不出一个表的fixture文件会更新另一个表的情况。如果你需要这个,我建议使用Doctrine模型及其方法编写一个小数据加载脚本。

<强>更新

最初误解了这个问题:我不认为固定装置可以用来实际更新现有记录。 “append”选项是将更多数据附加到已包含数据的表中。我认为它是独立的,因为通常的夹具只会用于刚刚构建的表并且您要测试 - 而不是实际对现有数据执行更新操作。为此,我建议写一个单独的脚本。

<强>更新

greg0ire:我使用了这个解决方案,但它确实有效。 首先,我将command.post_command事件连接到我的脚本:

$this->dispatcher->connect('command.post_command',
  array('MmcCmsDoctrineDataLoadTaskListener', 'fixCircularReferences'));

然后,在我的脚本中,我检查任务是“数据加载”,并使缺少的链接关闭圆圈。

public static function fixCircularReferences(sfEvent $event)
{
  /* @var $task sfTask */
  $task = $event->getSubject();
  if ($task->getName() == 'data-load')
  {
    // make the links here
  }
}

警告:不要试图在灯具中创建圆形,但故意让一个关系为空,否则会遇到奇怪的问题。