Doctrine ошибка в очень простом запросе на присоединение OneToOne - PullRequest
0 голосов
/ 20 апреля 2020

С Symfony и Doctrine у меня есть запрос на соединение, который не работает (OneToOne). Я не понимаю, потому что я привык делать идентичные запросы, и это работает ... Я, должно быть, сделал большую видимую ошибку, но не могу ее найти.

Запрос:

public function findByUuidAndName(string $uuid, string $name)
{
    return $this
        ->createQueryBuilder('userMedia')
        ->innerJoin('App:Media', 'media', 'WITH', '
            userMedia.media = media
        ')
        ->andWhere('media.uuid = :uuid')
        ->andWhere('media.name = :name')
        ->setParameter('uuid', $uuid)
        ->setParameter('name', $name)
        ->select('
            userMedia,
            media
        ')
        ->getQuery()
        ->getOneOrNullResult()
    ;
}

Вернуть эту ошибку:

Для запроса было найдено более одного результата, хотя ожидалась одна строка или ни одного.

Я хорошо проверил. Когда я предоставляю uuid и name, у меня есть только одна запись в базе данных. Я скопировал выполняемый запрос в PHPMyadmin, и у меня есть только одна строка.

Похоже, что addSelect (userMedia, media) пытается вернуть две строки вместо одной гидратированной (носитель должен быть в userMedia.media)

UserMedia сущность:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * UserMedia
 *
 * @ORM\Entity(repositoryClass="App\Repository\UserMediaRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class UserMedia
{
    /**
     * @var integer
     *
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var Media
     *
     * @ORM\OneToOne(
     *     targetEntity="App\Entity\Media",
     *     cascade={"persist"},
     *     fetch="EAGER"
     * )
     */
    private $media;

    /**
     * @var \DateTime
     *
     * @ORM\Column(type="datetime")
     */
    private $createdAt;

    /**
     * @var User
     *
     * @ORM\ManyToOne(targetEntity="App\Entity\User")
     */
    private $createdBy;

    public function getMedia(): ?Media
    {
        return $this->media;
    }

    public function setMedia(?Media $media): void
    {
        $this->media = $media;
    }

    ... (setters & getters)
}

Media сущность:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;

/**
 * Media
 *
 * @ORM\Entity(repositoryClass="App\Repository\MediaRepository")
 */
class Media
{
    /**
     * @var integer
     *
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var File
     */
    private $file;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=36)
     */
    private $uuid;

    /**
     * @var string
     *
     * @ORM\Column(type="string")
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=8)
     */
    private $extension;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=15)
     */
    private $mime;

    /**
     * @var integer
     *
     * @ORM\Column(type="integer", options={"unsigned"=true})
     */
    private $size;

    ... (setters & getters)
}

1 Ответ

0 голосов
/ 20 апреля 2020
public function findByUuidAndName(string $uuid, string $name)
    {
        return $this
            ->createQueryBuilder('userMedia')
            ->leftJoin('userMedia.media', 'media')
            ->andWhere('media.uuid = :uuid')
            ->andWhere('media.name = :name')
            ->setParameter('uuid', $uuid)
            ->setParameter('name', $name)
            ->getQuery()
            ->getOneOrNullResult()
        ;
    }

Это должно работать

...