我试图在现场论坛上加入实体PhpbbTopics和PhpbbForums。这些是PhpBB表,因此不在数据库级别上有外键。但是,当使用DQL连接两个实体时,我得到以下异常:
[Semantical Error] line 0, col 78 near 'f': Error: Class
Project\MyBundle\Entity\PhpbbTopics has no association named forumId
我的Controller中正在执行的代码是:
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
'SELECT f.forumName
FROM ProjectMyBundle:PhpbbTopics t JOIN t.forumId f'
);
这两个人是:
**
* PhpbbTopics
*
* @ORM\Table(name="phpbb_topics", indexes={@ORM\Index(name="forum_id", columns={"forum_id"}), @ORM\Index(name="forum_id_type", columns={"forum_id", "topic_type"}), @ORM\Index(name="last_post_time", columns={"topic_last_post_time"}), @ORM\Index(name="topic_approved", columns={"topic_approved"}), @ORM\Index(name="forum_appr_last", columns={"forum_id", "topic_approved", "topic_last_post_id"}), @ORM\Index(name="fid_time_moved", columns={"forum_id", "topic_last_post_time", "topic_moved_id"})})
* @ORM\Entity
*/
class PhpbbTopics
{
/**
* @var \Project\MyBundle\Entity\PhpbbForums
*
* @ORM\ManyToOne(targetEntity="Project\MyBundle\Entity\PhpbbForums")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="forum_id", referencedColumnName="forum_id")
* })
*/
private $forumId;
}
和
/**
* PhpbbForums
*
* @ORM\Table(name="phpbb_forums", indexes={@ORM\Index(name="left_right_id", columns={"left_id", "right_id"}), @ORM\Index(name="forum_lastpost_id", columns={"forum_last_post_id"})})
* @ORM\Entity
*/
class PhpbbForums
{
/**
* @var integer
*
* @ORM\Column(name="forum_id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $forumId;
/**
* @var string
*
* @ORM\Column(name="forum_name", type="string", length=255, nullable=false)
*/
private $forumName;
}
这两个实体都有比我所示更多的字段。我的查询中未使用这些字段。每个字段也有一个getter和setter,未显示。如果您觉得需要查看更多实体,请发表评论。
我尝试了以下解决方案,但它们没有解决我的问题:
修改
我发现PhpbbTopics.om.xml
处的文件src\Project\MyBundle\Resources\config\doctrine
未包含与PhpbbForums的关系。我已经更换了这条线:
<field name="forumId" type="integer" column="forum_id" nullable="false"/>
使用:
<many-to-one field="forumId" target-entity="PhpbbForums">
<join-columns>
<join-column name="forum_id" referenced-column-name="forum_id"/>
</join-columns>
</many-to-one>
这并未解决或改变问题。
答案 0 :(得分:0)
我通过更改连接的语法解决了我的问题。我现在使用的语法现在明确说明哪些实体应该连接在一起的字段。新查询是:
$query = $em->createQuery(
'SELECT f.forumName
FROM ProjectMyBundle:PhpbbTopics t JOIN ProjectMyBundle:PhpbbForums f WITH f.forumId = t.forumId'
);
通过使用此查询,我可以删除我在PhpbbTopics.php
和PhpbbTopics.om.xml
中定义的ManyToOne关系。没有声明的关系,我的实体与我的数据库表更接近,因为表phpbb_topics没有phpbb_forums的外键。