我使用Symfony 2.8。我有两个表,并且两者的主键都由3列组成:
id, tipo_corso, comune
02, it, devi
01, en, capi
09, es, file
显然,两个表具有其他不同的列。我不能仅使用一两列来更改主键。对于StranieriCRS表中的一条记录,EsoneroLingua表(OneToMany)中有许多记录:
第一个实体:
class StranieriCRS
{
/**
* @ORM\Column(type="string")
* @ORM\Id
*/
private $id;
/**
* @ORM\Column(type="string")
* @ORM\Id
*/
private $tipo_corso;
/**
* @ORM\Column(type="string")
* @ORM\Id
*/
private $comune;
public function __construct($id, $tipo_corso, $comune)
{
$this->id = $id;
$this->tipo_corso = $tipo_corso;
$this->comune = $comune;
$this->esonerolingua = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* @ORM\OneToMany(targetEntity="EsoneroLingua", mappedBy="stranieriCRS", fetch="EAGER")
*/
private $esonerolingua;
/**
* Get esonerolingua
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getEsonerolingua()
{
return $this->esonerolingua;
}
第二个实体:
class EsoneroLingua
{
/**
* @ORM\Column(type="string")
* @ORM\Id
*/
private $id;
/**
* @ORM\Column(type="string")
* @ORM\Id
*/
private $tipo_corso;
/**
* @ORM\Column(type="string")
* @ORM\Id
*/
private $comune;
public function __construct($id, $tipo_corso, $comune)
{
$this->id = $id;
$this->tipo_corso = $tipo_corso;
$this->comune = $comune;
}
/**
* @ORM\ManyToOne(targetEntity="StranieriCRS", inversedBy="esonerolingua")
* @ORM\JoinColumns(
* @ORM\JoinColumn(name="id", referencedColumnName="id"),
* @ORM\JoinColumn(name="tipo_corso", referencedColumnName="tipo_corso"),
* @ORM\JoinColumn(name="comune", referencedColumnName="comune"),
* )
*/
private $stranieriCRS;
当我想要获取StranieriCRS对象时会发生问题,因为他只给我一个结果,好像是一个OneToOne关系。 我的控制器:
$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中,我期望N条EsoneroLingua记录具有StranieriCRS相同的记录,但是我只有一个EsoneroLingua具有正确的StranieriCRS对象。似乎像OneToOne关系一样工作...为什么?另外,如果我做了dump($ sql-> getSql());我获得了原始sql ...我尝试直接在我的数据库中使用它,他给了我正确的结果。这是教义上的错误吗?
答案 0 :(得分:1)
要建立双向一对多,仅在多对一侧指定JoinColumns
。
因此,在StranieriCRS
中,删除以下几行:
* @ORM\JoinColumns(
* @ORM\JoinColumn(name="id", referencedColumnName="id"),
* @ORM\JoinColumn(name="tipo_corso", referencedColumnName="tipo_corso"),
* @ORM\JoinColumn(name="comune", referencedColumnName="comune"),
* )
然后让Doctrine猜测具有inversedBy
和mappedBy
属性的列。
有关映射的更多信息,请参见this page。