Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2+;推进集合未定义偏移:2_Php_Symfony_Propel - Fatal编程技术网

Php Symfony2+;推进集合未定义偏移:2

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

我们使用Prope和Symfony2表单创建了一个集合。我们可以毫无问题地保存表单,并且可以使用集合添加第二个选项。如果随后保存并尝试在中添加第三个集合,则会出现以下错误:

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>