我正在尝试编写将两个映射到实体的代码,但结果是, 我收到一个错误的未定义索引: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"/>
我做错了。我想获取具有所有其他filterOptions实体的数组中属性$ options的Filter实体。
答案 0 :(得分:1)
您需要将Doctrine中的关系视为对象之间的关系,而不是数据库中的关系。因此,您不应将filter_id
之类的数据库列视为普通属性,而应将其替换为实际的实体关联。
在您的情况下,您需要使用多对一关联的反面将普通的filterId
属性替换为FilterOption
实体。有关详细信息,请参阅教义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>