Doctrine在Symfony中找不到方法

3

我有一个问题一直困扰着我。 我试图使用Symfony中的DQL连接几个表,但它一直抛出一个异常,显示:

"在@App/default/index.html.twig的第37行,对象“AppBundle\Entity\Keyword”的方法“rankings”不存在"

这是我的DQL语句:

$query = $em->createQuery(
        'SELECT e,k,r
         FROM AppBundle:Keyword k
         JOIN k.company c
         LEFT JOIN k.entry e
         LEFT JOIN e.rankings r
         WHERE c.user = :id
         ORDER BY k.name ASC'
    )->setParameter('id',$user_id);


$keywords = $query->getResult();

我想我知道问题所在,但不知道如何解决。 我的关键词实体看起来像这样:

AppBundle\Entity\Keyword:
type: entity
table: null
id:
    id:
        type: integer
        id: true
        generator:
            strategy: AUTO
fields:
    name:
        type: string
        length: 255

manyToOne:
    company:
        targetEntity: AppBundle\Entity\Company

oneToMany:
     entry:
        targetEntity: AppBundle\Entity\Entry
        mappedBy: keyword


lifecycleCallbacks: {  }

请注意,排名实体和关键词实体之间没有直接的连接关系 - 这种关系在条目实体中,该实体是关键词实体和排名实体之间的链接。
AppBundle\Entity\Entry:
type: entity
table: null
id:
    id:
        type: integer
        id: true
        generator:
            strategy: AUTO
fields:
    path:
        type: string
        length: 255

manyToOne:
     keyword:
        targetEntity: AppBundle\Entity\Keyword

oneToMany:
     rankings:
        targetEntity: AppBundle\Entity\Ranking
        mappedBy: entry

lifecycleCallbacks: {  }

这里是排名实体:

AppBundle\Entity\Ranking:
type: entity
table: null
id:
    id:
        type: integer
        id: true
        generator:
            strategy: AUTO
fields:
    position:
        type: integer
    visits:
        type: integer
        nullable: TRUE
    bounces:
        type: integer
        nullable: TRUE
    date:
        type: datetime


manyToOne:
    entry:
        targetEntity: AppBundle\Entity\Entry

lifecycleCallbacks: {  }

我是一名有用的助手,可以为您翻译文本。以下是需要翻译的内容:

非常感谢各种帮助!:)

编辑

好的,如果我将上面写的DQL传递给twig模板: 如果它是manyToOne关系,我该如何检索排名? 如果我这样做:

   {% for ranking in keyword.entry.rankings %}
      <td>{{ ranking.id }}</td>
   {% endfor %}

它给我一个错误信息:"Doctrine\ORM\PersistentCollection"对象的方法"rankings"在@App/default/index.html.twig的第37行不存在。

2个回答

1

按照我这里展示的修改您的twig文件

{% for entry in keyword.entry %}
  {% for ranking in entry.rankings %}
    <td>{{ ranking.id }}</td>
  {% endfor %}
{% endfor %}

因为“entry”不是单个实体,而是实体的集合。
您还将其写入了实体映射文件中。
AppBundle\Entity\Keyword:
[...]
oneToMany:
     entry:
        targetEntity: AppBundle\Entity\Entry
        mappedBy: keyword

因此,即使您的查询仅从关系中提取一个记录,结果也将是一个集合(在这种情况下,是一个 PersistenCollection)。

0

如果你想要排名,你应该通过Entry来检索它。

你不需要为此编写DQL,只需使用$em返回给你的对象:

$ranking = $em->find('AppBundle:Keyword', $keywordId)->getEntry()->getRanking();

你已经定义好所有的实体类了吗?

http://symfony.com/doc/current/book/doctrine.html

编辑

如果您收到一个错误,指尝试访问集合的属性,则意味着您不是使用OneToOne而是OneToMany关系。您应该在访问Ranking之前循环处理该集合。每个Entry元素都有一个Ranking,而不是集合具有排名。


嗨Rvanlaak,感谢您的快速回复!太棒了,看起来很简单,但我应该在控制器中写入行还是在模板中写入? - Mathias Lund
对于Twig模板,您可以将keyword传递给模板,然后在那里执行以下操作:`{{ keyword.entry.ranking }}`这里我假设关系是OneToOne - Rvanlaak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接