让我们考虑一下这个模型:
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对象关系的对象,该对象自己引用一个对象,如果是,如何? 更通用的问题,是否可能:
或者更简单地说,是否可以使用灯具更新对象? 在汤姆的回答之后我尝试了
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标识符......我可以尝试什么?
答案 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
}
}
警告:不要试图在灯具中创建圆形,但故意让一个关系为空,否则会遇到奇怪的问题。