2015-07-01 4 views
3

У меня эта проблема, которая меня раздражает. Я пытаюсь присоединиться к нескольким таблицам с DQL в symfony, но он продолжает бросать исключение:Doctrine не может найти метод в symfony

«Ранг метода» для объекта «AppBundle \ Entity \ Keyword» не существует в @ App/default /index.html.twig в строке 37"

Это мой 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: { } 

Я ценю все виды помощи! :)

EDIT

Итак, если я прохожу DQL написанного выше шаблон веточки: Как получить рейтинг, если это ManyToOne отношение? Если я так:

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

это дает мне метод «рейтинга» для объекта «Доктрины \ ORM \ PersistentCollection» не существует в @ App/по умолчанию/index.html.twig в строке 37

ответ

1

Измените прут, как я покажу вам здесь

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

, потому что запись не является юридическим лицом, а набор сущностей

Вы также записываются в файл отображения объекта

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

EDIT

Если вы получаете сообщение об ошибке, когда вы пытаетесь получить доступ к свойству коллекции, это означает, что вы не используете OneToOne но и OneToMany отношение. Перед тем, как получить доступ к Ranking, вы должны перебрать эту коллекцию. Каждый элемент Entry имеет Ranking, это не коллекция, имеющая рейтинг.

+0

hi Rvanlaak, спасибо за быстрый ответ! Удивительно, это кажется простым, но я пишу это в строке в контроллере или в шаблоне? –

+0

Для шаблона Twig вы можете передать 'ключевое слово' в шаблон, а затем вы можете сделать следующее: ' {{keyword.entry.ranking}} ' Здесь я предполагаю, что отношения являются' OneToOne'. – Rvanlaak

+0

Привет, см. Edit :) –

Смежные вопросы