2015-11-18 3 views
1

Я занимался небольшим исследованием по запросам Doctrine, так как мне нужно было получить некоторые результаты на основе двух статей, в данном случае «Тип» и «Клиент». Я читал о магии Finders на this page и использовать эту логику, чтобы создать следующий вызов:Doctrine Magic Finders работают неправильно - Symfony2

$collections = $repo->findByTypeAndClient('collection',$client); 

Как есть поля: тип и клиент в моей таблице. Однако, когда я бегу сценарий, я получаю следующее сообщение об ошибке:

Entity 'AppBundle\Entity\CollectionDelivery' has no field 'typeAndClient'. You can therefore not call 'findByTypeAndClient' on the entities' repository

, который заставляет меня думать, я мог бы сделать что-то неправильно, или, может быть, я что-то очевидное отсутствует?

Я использую Symfony2 - любая помощь оценена! Спасибо!

+0

В этом случае, 'findByTypeAndClient()' должен быть метод вашего CollectionDeliveryRepository. – scoolnico

+1

Конечно, похоже, что это сработает. Проверьте findByType, а findByClient работает как ожидалось. Тип - это зарезервированное слово в mysql. Это может вызвать проблемы, хотя это кажется маловероятным на основе вашего сообщения об ошибке. – Cerad

+0

findByType и findByClient определенно работают, они используются в других функциях сами по себе, это просто, когда написано вот так ... –

ответ

1

Да вы сделали что-то неправильно ^^

Магические методы работы только на одном поле вашего лица. Вы можете сделать:

$collections = $repo->findByType('collection'); 

$collections = $repo->findByClient($client); 

Но если вы хотите обычай найти по типу и клиентом, вы должны добавить метод в репозитории:

public function findByTypeAndClient($type, $client) { 
    $qb = $this->createQueryBuilder('c'); 
    $qb->where('c.type = :type') 
     ->where('c.client = :client') 
     ->setParameter(':type', $type) 
     ->setParameter(':client', $client); 
    return $qb->getQuery()->getResult(); 
} 
+0

И Doctrine советует не использовать это, когда у вас есть более одного результата или объекта с отношениями. Но да, вы правы, мы можем это сделать :) –

+1

Ну. Не обращайте внимания на мои предыдущие комментарии. Doctrine 2 не поддерживает предложение And, как Doctrine 1. Хотя вы все равно можете передать массив аргументов findBy вместо создания пользовательского репозитория и запроса. – Cerad

+1

Изобразительное. Но для вашего решения я предпочитаю проходить репо для обслуживания и иметь контроллер полностью СУХОЙ. Это не займет больше времени, и вы сможете сэкономить много времени после –