Объект отношения Doctrine2 findBy вызывает ошибку преобразования строки


Допустим, у меня есть две сущности в Доктрине2, которые связаны друг с другом, Модели\Пользователь и Модели\Комментарий. Если я сделаю это в Доктрине 2.0.0...

<?php
// $em instanceof EntityManager, $user instanceof Models\User
$comments = $em->getRepository('Models\Comment')
    ->findBy(array('user' => $user, 'public' => true));

...Я получаю ошибку PHP:

Серьезность: Обратите внимание

Сообщение: Объект моделей классов\Преобразование пользователя в строку

Имя файла: DBAL/Connection.php

Номер строки: 574

Этого не должно было случиться, верно? Если я использую QueryBuilder и setParameter ("пользователь", $user), он работает как ожидаемый.

Author: pdd, 2011-01-06

3 answers

Запрос по связи разрешен, но вы должны передать идентификатор туда. Запрос по объекту еще не поддерживается и будет выполнен только в 2.1.

<?php
// $em instanceof EntityManager, $user instanceof Models\User
$comments = $em->getRepository('Models\Comment')
->findBy(array('user' => $user->getId(), 'public' => true));
 30
Author: beberlei, 2011-01-07 11:30:47

К сожалению, я не думаю, что запрос по связям поддерживается напрямую через объекты репозитория.

В этом случае вам, вероятно, лучше всего написать пользовательский класс репозитория с методом findByUser.

<?php

namespace App\Domain\Repository;

use Doctrine\ORM\EntityRepository,
    App\Domain\Entity\User;

class CommentRepository extends EntityRepository
{

    public function findByUser(User $user)
    {
        // add QueryBuilder code here
    }

}

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

<?php

namespace App\Domain\Entity;


/** 
 * @Entity(repositoryClass="App\Domain\Repository\CommentRepository")
 */
class Comment 
{

    // entity definition

}
 0
Author: Cobby, 2011-01-07 02:23:40

Для symfony 4.1 этот код работал для меня.

$comments = $this->getDoctrine()
                ->getRepository(Models\Comment::class)
                ->findBy(
                ['user' => $user->getId(), 'public' => true]
);
 0
Author: vimuth, 2018-08-28 09:58:44