我正在尝试编写一个将两个映射到实体的代码,但结果是, 我收到错误 未定义的索引:过滤器ID
所以没有教义,查询很简单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"/>
我做错了什么。我想获取过滤器实体,其中属性与所有其他过滤器选项实体一起$options在数组中。
你需要把教义中的关系看作是对象之间的关系,而不是数据库之间的关系。因此,您不应将数据库列(如filter_id
)视为普通属性,而是需要将它们替换为实际的实体关联。
在您的情况下,您需要将普通filterId
属性替换为具有多对一关联反侧FilterOption
实体。有关详细信息,请参阅教义文档。
您的代码可能如下所示:
过滤器.php
class Filter
{
/**
* @var int
*/
private $id;
/**
* @var string
*/
private $status;
/**
* @var FilterOption[]
*/
private $options;
}
过滤器选项.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>