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>
我正在尝试编写将两个映射到实体的代码,但结果是, 我收到错误 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>