我使用Symfony 2.8。我有两个表,两个主键都由 3 列组成:
id, tipo_corso, comune
02, it, devi
01, en, capi
09, es, file
显然,这两个表还有其他不同的列。我不能仅使用一两列来更改主键。对于StranieriCRS表中的一条记录,EsoneroLingua表(OneToMany(中有许多记录:
第一个实体:
class StranieriCRS
{
/**
* @ORMColumn(type="string")
* @ORMId
*/
private $id;
/**
* @ORMColumn(type="string")
* @ORMId
*/
private $tipo_corso;
/**
* @ORMColumn(type="string")
* @ORMId
*/
private $comune;
public function __construct($id, $tipo_corso, $comune)
{
$this->id = $id;
$this->tipo_corso = $tipo_corso;
$this->comune = $comune;
$this->esonerolingua = new DoctrineCommonCollectionsArrayCollection();
}
/**
* @ORMOneToMany(targetEntity="EsoneroLingua", mappedBy="stranieriCRS", fetch="EAGER")
*/
private $esonerolingua;
/**
* Get esonerolingua
*
* @return DoctrineCommonCollectionsCollection
*/
public function getEsonerolingua()
{
return $this->esonerolingua;
}
第二个实体:
class EsoneroLingua
{
/**
* @ORMColumn(type="string")
* @ORMId
*/
private $id;
/**
* @ORMColumn(type="string")
* @ORMId
*/
private $tipo_corso;
/**
* @ORMColumn(type="string")
* @ORMId
*/
private $comune;
public function __construct($id, $tipo_corso, $comune)
{
$this->id = $id;
$this->tipo_corso = $tipo_corso;
$this->comune = $comune;
}
/**
* @ORMManyToOne(targetEntity="StranieriCRS", inversedBy="esonerolingua")
* @ORMJoinColumns(
* @ORMJoinColumn(name="id", referencedColumnName="id"),
* @ORMJoinColumn(name="tipo_corso", referencedColumnName="tipo_corso"),
* @ORMJoinColumn(name="comune", referencedColumnName="comune"),
* )
*/
private $stranieriCRS;
当我想获取 StranieriCRS 对象时出现问题,因为他只给我一个结果......似乎是一对一的关系。 我的控制器:
$sql = $entityManager->createQuery("
SELECT c
FROM AppBundle:EsoneroLingua c
WHERE c.id = '1546871' and c.tipo_corso = 'C' and c.comune = '7868'
");
$test = $sql->getResult();
在$test,我期望EsoneroLingua的N条记录具有相同的记录StranieriCRS,但我只得到一个具有正确StranieriCRS对象的EsoneroLingua。似乎工作像一对一的关系...为什么? 另外,如果我做了dump($sql->getSql(((;我获得原始的sql...我尝试直接在我的数据库中使用它,他给了我正确的结果。是教义错误吗?
要创建双向一对多,请仅在多对一端指定JoinColumns
。
因此,在StranieriCRS
中删除以下行:
* @ORMJoinColumns(
* @ORMJoinColumn(name="id", referencedColumnName="id"),
* @ORMJoinColumn(name="tipo_corso", referencedColumnName="tipo_corso"),
* @ORMJoinColumn(name="comune", referencedColumnName="comune"),
* )
只需让 Doctrine 猜测具有inversedBy
和mappedBy
属性的列。
有关映射的详细信息,请参阅此页面。