Mas*_*iro 5 symfony doctrine-orm
我有以下两个类具有ManyToMany关系并保存在一个名为的连接表中countries_involved.
class CountriesInvolved
{
/**
* @var integer
*/
private $id;
/**
* @var string
*/
private $description;
/**
* @var \DateTime
*/
private $createdAt;
/**
* @var \DateTime
*/
private $updatedAt;
/**
* @var \ACME\SouthBundle\Entity\Country
*/
private $country;
/**
* @var \Doctrine\Common\Collections\Collection
*/
private $involvement;
}
Run Code Online (Sandbox Code Playgroud)
和
class Involvement
{
/**
* @var integer
*/
private $id;
/**
* @var string
*/
private $name;
/**
* @var string
*/
private $description;
}
Run Code Online (Sandbox Code Playgroud)
该关系在YML中定义如下
manyToMany:
involvement:
targetEntity: Involvement
joinTable:
name: countries_involvement
joinColumns:
case_country_involved_id:
referencedColumnName: id
inverseJoinColumns:
involvement_id:
referencedColumnName: id
Run Code Online (Sandbox Code Playgroud)
我试图根据参与的id返回涉及的国家的结果,但是在编写查询时却没有出现错误.这是我到目前为止所尝试的:
$em = $this->getDoctrine()->getManager()->createQueryBuilder();
$q = $em->select('c')
->from('ACMESouthBundle:CountriesInvolved','c')
->innerJOIN('c.Involvement','i')
->where('i.id = 1')
->groupBy('c.country')->getQuery();
Run Code Online (Sandbox Code Playgroud)
错误是:
[Semantical Error] line 0, col 80 near 'i WHERE i.id': Error: Class ACME\SouthBundle\Entity\CountriesInvolved has no association named Involvement
Run Code Online (Sandbox Code Playgroud)
小智 10
首先,我建议使用注释,您的代码将更具可读性.
我认为问题是,你已经忘记了inversedBy和mappedBy性能.
以下代码是使用注释解决问题的可能方法.
您应该将此代码添加到Involvement实体:
/**
* @ORM\ManyToMany(targetEntity="CountriesInvolved", inversedBy="involvement")
* @ORM\JoinTable(name="countries_involvement",
* joinColumns={@ORM\JoinColumn(name="case_country_involved_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="involvement_id", referencedColumnName="id")}
* )
*/
private $countries;
Run Code Online (Sandbox Code Playgroud)
在CountriesInvolved实体中,您应该在以下内容中添加以下注释$involvement:
/**
* @ORM\ManyToMany(targetEntity="Involvement", mappedBy="countries")
*/
private $involvement;
Run Code Online (Sandbox Code Playgroud)
我刚刚重写了查询,如下所示:
$em = $this->getEntityManager();
$query = $em->createQuery('
SELECT c
FROM ACMESouthBundle:CountriesInvolved c
JOIN c.involvement i
WHERE i.id = :id
');
$query->setParameter('id', '1');
return $query->getResult();
Run Code Online (Sandbox Code Playgroud)
这是使用YAML方法:
CountriesInvolved:
manyToMany:
involvement:
targetEntity: Involvement
mappedBy: countries
CountriesInvolved:
manyToMany:
countries:
targetEntity: CountriesInvolved
inversedBy: involvement
joinTable:
name: countries_involvement
joinColumns:
case_country_involved_id:
referencedColumnName: id
inverseJoinColumns:
involvement_id:
referencedColumnName: id
Run Code Online (Sandbox Code Playgroud)