Symfony1 如何使用夹具创建圆形参照? 我们考虑这个模型: 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

Symfony1 如何使用夹具创建圆形参照? 我们考虑这个模型: 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,symfony1,doctrine,Symfony1,Doctrine,请注意,b_id可以为null。 是否可以使用一个或多个装置创建一个与引用A对象自身的B对象相关的A对象,如果可以,如何创建? 更一般的问题,是否可以: 创建一个 创建一个B 更新A 或者更简单地说,是否可以使用夹具更新对象? 汤姆回答后,我试了一下 greg@liche:~/project/symfony$ ./symfony doctrine:data-load update --append >> doctrine Loading data fixtures from "u

请注意,b_id可以为null。 是否可以使用一个或多个装置创建一个与引用A对象自身的B对象相关的A对象,如果可以,如何创建? 更一般的问题,是否可以:

  • 创建一个
  • 创建一个B
  • 更新A
  • 或者更简单地说,是否可以使用夹具更新对象? 汤姆回答后,我试了一下

    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标识符。。。我能试试什么?

    装置是用来向表中添加一些数据的,所以是的,它是关于用装置数据更新对象的

    只要不违反模式中指定的约束,就可以随意添加此数据。对于关系,引用值必须在引用值之前,否则无法声明关系

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

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

    更新:

    最初误解了这个问题:我不认为fixture可以用于实际更新现有记录。“append”选项是将更多数据追加到已包含数据的表中。我认为这是独立的,因为通常情况下,fixture只会用于刚刚构建的表,并且您希望测试这些表,而不是实际对现有数据执行更新操作。为此,我建议写一个单独的脚本

    更新:

    格雷格:我使用了这个解决方案,它很有效。 首先,我将
    命令.post_命令
    事件连接到脚本:

    $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
      }
    }
    

    警告:不要尝试在装置中创建循环,而是故意让一个关系为空,否则会遇到奇怪的问题。

    简而言之,您是说我可以使用一个装置文件执行步骤1和2,然后使用另一个装置文件更新A记录?夹具文件会是什么样子?@greg0ire:实际上我想我误解了你原来的问题。。。我不认为fixture可以用于实际更新现有记录。“append”选项是将更多数据追加到已包含数据的表中。我认为这是独立的,因为通常情况下,fixture只会用于刚刚构建的表,并且您希望测试这些表,而不是实际对现有数据执行更新操作。对于这一点,我建议写一个单独的脚本。我会等待,以防有人使用fixture发布另一个答案,但我认为你是对的。请更新您的答案,如果一段时间后没有其他答案,我将接受。