У меня есть модель базы данных с двумя таблицами: пользователь и экспериментирование. Отношение n: n, поэтому я создал третью таблицу с двумя внешними ключами.
| Эксперимент | 1 ------- 0..n | ExperimentationUser | 0..n ------- 1 | Пользователь |
Сущность создается благодаря Доктрине (с аннотациями). Я получил UserEntity и ExperimentationEntity, но не ExperimentationUserEntity. Когда я смотрю в USEREntity, я могу найти коллекцию "связанных идентификаторов экспериментов".
Я хотел бы получить все имена экспериментов (не идентификаторы) для указанного Пользователя. В общем SQL я присоединяюсь к Experimentation и ExperimentationUser с предложением WHERE (для выбора идентификатора пользователя). Но так как я начинаю проект Symfony (2.8), я бы хотел использовать QueryBuilder.
Я не знаком с синтаксисом, и я понятия не имею, как я могу это достичь. То, что я пробовал:
$repository = $this->getDoctrine()->getRepository('AppBundle:Experimentation');
$query = $repository->createQueryBuilder('e')
->join('...')
->setParameter('id',$id)
->getQuery();
Но я не знаю, что добавить в предложение о join
. Я даже не уверен, что мне это нужно.
Спасибо за вашу помощь!
Так я и делаю такие вещи. Я не использую построитель запросов, но вы получаете идею.
В объекте
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Experimentation
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="AppBundle\Entity\ExperimentationRepository")
*/
class Experimentation
{
//...
}
В классе репозитория
namespace AppBundle\Entity;
use Doctrine\ORM\EntityRepository;
class ExperimentationRepository extends EntityRepository
{
public function getExperimentationByUser($id) {
$em = $this->getEntityManager();
$query = $em->createQuery('SELECT e '
. 'FROM AppBundle:Experimentation e '
. 'JOIN e.experimentationUsers eu '
. 'JOIN eu.user u '
. 'WHERE u.id = :id ')
->setParameter('id', $id);
return $query->getResult();
}
}
Затем в контроллере
//..
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('AppBundle:Experimentation')->getExperimentationByUser($user_id);
//..
Таким образом, вы можете получить список экспериментов a, затем получить его имя, а также в запросе положить просто $query = $em->createQuery('SELECT e.name '
. Если вам также нужны данные, связанные с пользователем, можно положить $query = $em->createQuery('SELECT e, u '
и, возможно, вы можете сохранить запрос на базу данных.
Надеюсь, это поможет вам.