Php Symfony2+;推进集合未定义偏移:2
我们使用Prope和Symfony2表单创建了一个集合。我们可以毫无问题地保存表单,并且可以使用集合添加第二个选项。如果随后保存并尝试在中添加第三个集合,则会出现以下错误:Php Symfony2+;推进集合未定义偏移:2,php,symfony,propel,Php,Symfony,Propel,我们使用Prope和Symfony2表单创建了一个集合。我们可以毫无问题地保存表单,并且可以使用集合添加第二个选项。如果随后保存并尝试在中添加第三个集合,则会出现以下错误: Notice: Undefined offset: 2 堆栈跟踪 in src/app/MyBundle/Model/om/BaseLabelsLabelsLinesMapsQuery.php at line 241 $cton0 = $this->getNewCriterion(LabelsLabelsLi
Notice: Undefined offset: 2
堆栈跟踪
in src/app/MyBundle/Model/om/BaseLabelsLabelsLinesMapsQuery.php at line 241
$cton0 = $this->getNewCriterion(LabelsLabelsLinesMapsPeer::ID, $key[0], Criteria::EQUAL);
$cton1 = $this->getNewCriterion(LabelsLabelsLinesMapsPeer::LABEL_ID, $key[1], Criteria::EQUAL);
$cton0->addAnd($cton1);
$cton2 = $this->getNewCriterion(LabelsLabelsLinesMapsPeer::LABEL_LINES_ID, $key[2], Criteria::EQUAL);
$cton0->addAnd($cton2);
$this->addOr($cton0);
}
我已经在下面发布了相关的代码,但是有大量的代码。我们想知道是否有人经历过同样的问题
我已经发送了一个错误报告,其中包含一段不同的代码,产生了相同的错误,但是我没有收到任何回复。错误报告是
这是相关架构的一个片段:
最后,下面是控制器
public function editAction(Request $request, $id = null)
{
$labels = LabelsQuery::create()->findPk($id);
$form = $this->createForm(new EditLabelType(), $labels);
$form->handleRequest($request);
if ($form->isValid()) {
$labels->save();
return $this->redirect($this->generateUrl("_admin_labels"));
}
return $this->render("AppLabelBundle:Admin:edit.html.twig", array("form" => $form->createView()));
}
我不是100%确定,但我相当肯定这是因为这一行:
$labels = LabelsQuery::create()->findPk($id);
您会注意到,在BaseQuery类中的findPkSimple方法中,变量键应该是一个具有3个值(索引0、1、2)的数组
我不确定的原因是,我不知道$id是一个值还是一个数组,因为您的函数定义没有限制类型。(您的编辑操作功能)
我认为,因为您有三个主键,所以生成的类希望您在按主键搜索时有三个单独的值
如果您只有一个主键,然后在这三列上有一个唯一的索引以确保唯一性(如果这是您想要的),可能会更有效。您的模式让我有点困惑。下面这一位包括三个主键,其中两个作为外键,一个作为行的唯一标识符:
<table name="labels_labels_lines_maps" isCrossRef="true">
<column name="id"
type="integer"
required="true"
autoIncrement="true"
primaryKey="true"/>
<column name="label_id"
type="integer"
primaryKey="true"/>
<column name="label_lines_id"
type="integer"
primaryKey="true"/>
<foreign-key foreignTable="labels" onDelete="cascade">
<reference local="label_id" foreign="id"/>
</foreign-key>
<foreign-key foreignTable="labels_lines" onDelete="cascade">
<reference local="label_lines_id" foreign="id"/>
</foreign-key>
<vendor type="mysql">
<parameter name="Engine" value="InnoDB" />
<parameter name="Charset" value="utf8" />
</vendor>
</table>
我怀疑如果你选择一件事并坚持下去,你的许多麻烦可能会消失。删除id
并让主复合键表示两个完全有效的外部表,或者将每个外键上的primary key
s更改为UNIQUE
约束,将主键保留为id
。这也是完全正确的。最终,您的决定将基于您的设计需求
另一个注意事项:您可能希望也可能不希望执行一个操作,尤其是在引用主键中的各个列时。复合主键针对所有三列(而不是每一列)创建索引。这在您的项目中可能很重要,也可能不重要,但我认为值得指出。您的
BaselLabelsLinesMapsQuery.php
代码是什么?@Alex因为脚本中有几行我已经复制到了pastebin中。请注意,这段代码完全是由spreep生成的。只是为了澄清$id是单个id而不是数组。至于有一个主键。我从这里获取了以下内容(propolorm.org/documentation/cookbook/symfony2/mastering-symfony2-forms-with-prople.html#多对多关系),其中显示了多个主键。然而,在这个例子中,id实际上不在这个地图上。我认为这个例子可能已经过时,或者完全错了。在他们的示例中,主键也是外键。您好,谢谢您提到heavyIndexing。我实际上从未使用过它,所以我将对此进行研究。正如您所指出的,我最初使用的是以下模式(propolorm.org/documentation/cookbook/symfony2/mastering-symfony2-forms-with-prople.html#多对多关系)。Id实际上不在多对多模式中。我相信这可能是问题的根本原因。我会看一看,然后再回来找你。
public function editAction(Request $request, $id = null)
{
$labels = LabelsQuery::create()->findPk($id);
$form = $this->createForm(new EditLabelType(), $labels);
$form->handleRequest($request);
if ($form->isValid()) {
$labels->save();
return $this->redirect($this->generateUrl("_admin_labels"));
}
return $this->render("AppLabelBundle:Admin:edit.html.twig", array("form" => $form->createView()));
}
$labels = LabelsQuery::create()->findPk($id);
<table name="labels_labels_lines_maps" isCrossRef="true">
<column name="id"
type="integer"
required="true"
autoIncrement="true"
primaryKey="true"/>
<column name="label_id"
type="integer"
primaryKey="true"/>
<column name="label_lines_id"
type="integer"
primaryKey="true"/>
<foreign-key foreignTable="labels" onDelete="cascade">
<reference local="label_id" foreign="id"/>
</foreign-key>
<foreign-key foreignTable="labels_lines" onDelete="cascade">
<reference local="label_lines_id" foreign="id"/>
</foreign-key>
<vendor type="mysql">
<parameter name="Engine" value="InnoDB" />
<parameter name="Charset" value="utf8" />
</vendor>
</table>