Doctrine orm 映射 returns 错误未定义索引

Doctrine orm mapping returns error Undefined index

我正在尝试编写将两个映射到实体的代码,但结果是, 我收到错误 Undefined index: filterId

所以没有主义,查询很简单SELECT * FROM filter f INNER JOIN filter_options fo ON f.id = fo.filter_id WHERE f = 1;

所以我需要得到与此查询相同的结果。

表格示例:

filter

id|status
---------
1|active
2|active
3|active
filter_options:
id|filter_id|text
---------
1|1|lorem
2|1|ipsum
3|3|and
4|2|etc

实体类:

class Filter
{
   private $id;
   private $status;
   /**
    * @var FilterOption[]
    */
   private $options;
}

class FilterOption 
{
   private $id;
   private $filterId;
   private $text;
}

Filter.orm.xml:

<id name="id" column="id" type="integer">
   <generator strategy="AUTO" />
</id>
<field name="status" column="status"/>

<one-to-many field="options" target-entity="FilterOption" mapped-by="filterId"/>

FilterOption.orm.xml:

<id name="id" column="id" type="integer">
    <generator strategy="AUTO" />
</id>
<field name="text" column="text"/>

<field name="filterId" column="filter_id"/>

我做错了什么。我想获取 Filter 实体,其中 属性 $options 与所有其他 filterOptions 实体在一个数组中。

你需要将 Doctrine 中的关系视为对象之间的关系,而不是与数据库的关系。因此,您不应将 filter_id 之类的数据库列视为普通属性,它们需要替换为实际的实体关联。

在您的情况下,您需要将纯 filterId 属性 替换为具有多对一关联反面的 FilterOption 实体。详情请参考 Doctrine documentation

您的代码可能如下所示:

Filter.php

class Filter
{
   /**
    * @var int
    */
   private $id;
   /**
    * @var string
    */
   private $status;
   /**
    * @var FilterOption[]
    */
   private $options;
}

FilterOption.php

class FilterOption 
{
   /**
    * @var int
    */
   private $id;
   /**
    * @var Filter
    */
   private $filter;
   /**
    * @var string
    */
   private $text;
}

Filter.orm.xml:

<doctrine-mapping>
    <entity name="Filter" table="filter">
        <id name="id" column="id" type="integer">
            <generator strategy="AUTO" />
        </id>
        <field name="status" column="status"/>
        <one-to-many field="options" target-entity="FilterOption" mapped-by="filter"/>
    </entity>
<doctrine-mapping>

FilterOption.orm.xml:

<doctrine-mapping>
    <entity name="FilterOption" table="filter_option">
        <id name="id" column="id" type="integer">
            <generator strategy="AUTO" />
        </id>
        <field name="text" column="text"/>
        <many-to-one field="filter" target-entity="Filter" inversed-by="options">
            <join-column name="filter_id" referenced-column-name="id" />
        </many-to-one>
    </entity>
<doctrine-mapping>