【发布时间】:2018-08-21 07:20:31
【问题描述】:
我使用 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 中,我预计 EsoneroLingua 的 N 条记录具有相同的 StranieriCRS 记录,但我只得到一个具有正确 StranieriCRS 对象的 EsoneroLingua 记录。似乎像 OneToOne 关系一样工作......为什么?另外,如果我做了 dump($sql->getSql());我获得了原始 sql ...我尝试直接在我的数据库中使用它,他给了我正确的结果。是 Doctrine 错误吗?
【问题讨论】:
-
请尝试删除
JoinColumns注释。这和你的问题没有直接关系,但是这个注解在大多数情况下是没有用的,只会让你的代码变得混乱。 -
@lxg 我已经按照 LP154 的建议从 StranieriCRS 中删除了 JoinColumns 但没有任何改变:(
-
很高兴没有任何改变。您只是删除了不必要的代码,并没有变得更糟。恭喜! :) 顺便说一句,您可以在任何地方删除所有
JoinColumns。他们几乎从不需要。 -
好吧,对不起。所以也许这是一个教义错误?
-
但是在
EsoneroLingua中是否还有其他列是 Oracle 中的主键?因为如果没有,你就不能有多个EsoneroLingua具有相同的PK,所以你不能有一个ManyToOne
标签: symfony doctrine-orm doctrine doctrine-query