Доктрина: выберите таблицу, которая не управляется доктриной - PullRequest
0 голосов
/ 31 января 2019

Используя Doctrine QueryBuilder, я хочу выполнить запрос, который на нативном SQL выглядит следующим образом:

`SELECT image FROM image i INNER JOIN about_images a ON i.id = a.image_id`;

Результат в DQL следующий:

ImageRepository.php :

return $this->createQueryBuilder('i')
        ->select('i')
        ->innerJoin('about_images', 'a', 'WITH', 'i.id = a.imageId')
        ->getQuery()
        ->getResult();

Где image - это сущность, а about_images - это таблица соединений (результат отношения @ManyToMany).Тем не менее, я получаю сообщение об ошибке, что about_images не определено, что имеет смысл, так как не управляется доктриной.

AboutPage.php (т. Е. Сущность, в которой создается объединяемая таблица)

  /**
     * @var Image[]|ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity="App\Entity\Image", cascade={"persist", "remove"})
     * @ORM\JoinTable(name="about_images",
     *     joinColumns={@ORM\JoinColumn(name="about_id", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="image_id", referencedColumnName="id", unique=true)})
   */
    private $images;

Поля из сущности изображения:

    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @var File
     *
     * @Vich\UploadableField(mapping="collection_images", fileNameProperty="image")
     * @Assert\File(maxSize="150M", mimeTypes={"image/jpeg", "image/jpg", "image/png", "image/gif"},
     *     mimeTypesMessage="The type ({{ type }}) is invalid. Allowed image types are {{ types }}")
     */
    private $imageFile;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $imageAlt;

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

    /**
     * @var string
     *
     * @ORM\Column(type="string", nullable=true)
     */
    private $alt;

Какя могу решить эту проблему?Результаты должны быть Image сущностей.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Не совсем ясно пример sql с предоставленным вами кодом, но если у вас есть отношение, определенное в ваших сущностях, вы можете объединить их с помощью построителя запросов, просто сообщив поле отношения сущности, поэтому я думаю,это должно работать

return $this->createQueryBuilder('i')
    ->select('i')
    ->innerJoin('i.images', 'a')
    ->getQuery()
    ->getResult();

Поскольку вы уже определили свои отношения в ваших сущностях, Doctrine знает, как объединить ваши таблицы, поэтому вам просто нужно указать имя поля отношения и псевдоним.

И всегда помните, что вы должны использовать имя поля в вашей сущности (обычно cameCasedStyle), а не имя столбца в таблицах вашей базы данных (обычно snake_cased_style).

0 голосов
/ 31 января 2019

Вы можете написать собственный SQL, а затем отобразить вывод в ваши сущности, используя ResultSetMapper.

Для вашего примера это может выглядеть примерно так в вашем классе репозитория:

public function findImagesWithAboutImages()
{
    $sql = 'SELECT i.* FROM image i INNER JOIN about_images a ON i.id = a.image_id';
    $entityManager = $this->getEntityManager();

    $mappingBuilder = new ResultSetMappingBuilder($entityManager);
    $mappingBuilder->addRootEntityFromClassMetadata(Image::class, 'i');

    $query = $entityManager->createNativeQuery($sql, $mappingBuilder);
    // If you want to set parameters e.g. you have something like WHERE id = :id you can do it on this query object using setParameter()

    return $query->getResult();
}

ЕслиЕсли вам нужны связанные данные, вам нужно будет добавить их в предложение select с псевдонимом, а затем использовать $mappingBuilder->addJoinedEntityFromClassMetadata(), чтобы присвоить эти поля присоединенной сущности, как и в случае с корневой сущностью, как описано выше.

Ваши аннотации в вашей сущностиуже определите, как каждое поле отображается на свойство и какой у него тип, поэтому в основном вы должны получить массив Image-сущностей со всеми (кроме связанных сущностей) загруженными для использования.

...