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

#symfony #symfony4 #symfony-forms #query-builder #symfony5

#symfony #symfony4 #symfony-forms #конструктор запросов #symfony5

Вопрос:

  1. Я ищу, чтобы получить изображения баннера
  2. Каждый баннер содержит много изображений с отношением OneToMany
  3. Я думаю, что я просто выбрал баннер where isActive = true и получил коллекцию изображений, но, к сожалению, не вернул изображение

Этот запрос работает в SQL, но я застрял, как заставить его работать с помощью QueryBuilder:

 SELECT *
FROM image
INNER JOIN banner ON image.banner_id = banner.id
WHERE banner.is_active = true
  

Код:

 return $this->createQueryBuilder('i') 
            ->join('i.banner', 'b', 'on', 'i.banner_id=b.id') 
            ->andWhere('b.isActive LIKE :status') 
            ->setParameter('status',true) 
            ->getQuery(); ->execute();
  

Объект баннера:

 <?php

namespace AppEntity;

use AppRepositoryBannerRepository;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;

/**
 * @ORMEntity(repositoryClass=BannerRepository::class)
 */
class Banner
{
    /**
     * @ORMId
     * @ORMGeneratedValue
     * @ORMColumn(type="integer")
     */
    private $id;

    /**
     * @ORMColumn(type="string", length=255)
     */
    private $name;

    /**
     * @ORMColumn(type="string", length=255, nullable=true)
     */
    private $description;

    /**
     * @ORMOneToMany(targetEntity=Image::class, mappedBy="banner", orphanRemoval=true, cascade={"persist","remove"})
     */
    private $images;

    /**
     * @ORMColumn(type="boolean")
     */
    private $isActive;

    public function __construct()
    {
        $this->images = new ArrayCollection();
        $this->isActive=false;
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getDescription(): ?string
    {
        return $this->description;
    }

    public function setDescription(?string $description): self
    {
        $this->description = $description;

        return $this;
    }

    /**
     * @return Collection|Image[]
     */
    public function getImages(): Collection
    {
        return $this->images;
    }

    public function addImage(Image $image): self
    {
        if (!$this->images->contains($image)) {
            $this->images[] = $image;
            $image->setBanner($this);
        }

        return $this;
    }

    public function removeImage(Image $image): self
    {
        if ($this->images->contains($image)) {
            $this->images->removeElement($image);
            // set the owning side to null (unless already changed)
            if ($image->getBanner() === $this) {
                $image->setBanner(null);
            }
        }

        return $this;
    }

    public function getIsActive(): ?bool
    {
        return $this->isActive;
    }

    public function setIsActive(bool $isActive): self
    {
        $this->isActive = $isActive;

        return $this;
    }
}

  

Объект изображения:

 <?php

namespace AppEntity;

use AppRepositoryImageRepository;
use DoctrineORMMapping as ORM;

/**
 * @ORMEntity(repositoryClass=ImageRepository::class)
 */
class Image
{
    /**
     * @ORMId
     * @ORMGeneratedValue
     * @ORMColumn(type="integer")
     */
    private $id;

    /**
     * @ORMColumn(type="string", length=255)
     */
    private $name;

    /**
     * @ORMManyToOne(targetEntity=Banner::class, inversedBy="images")
     * @ORMJoinColumn(nullable=false)
     */
    private $banner;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getBanner(): ?Banner
    {
        return $this->banner;
    }

    public function setBanner(?Banner $banner): self
    {
        $this->banner = $banner;

        return $this;
    }
}

  

Комментарии:

1. Добавьте свою попытку с помощью QueryBuider с результатами

2. спасибо, брат, я сделал, но не сработал ` return $this->createQueryBuilder(‘i’) ->join(‘i.banner’, ‘b’, ‘on’, ‘i.banner_id=b.id ‘) ->andWhere(‘b.Активен КАК :статус’) ->setParameter(‘status’, true) -> getQuery(); -> execute();`

3. Подумайте о том, чтобы обновить свой вопрос с помощью вашего запроса DQL, чтобы он был доступен для чтения. Кнопка редактирования в левом нижнем углу. Но что еще более важно, прочитайте документы о том, как выполнить правильный запрос DQL. Также немного странно, что вам вообще нужно выполнять этот запрос. Обычно вы настраиваете загрузку изображений при загрузке баннера. Может быть, у вас есть крайний случай, когда вам не нужен баннер, но нужны изображения.

4. спасибо, cerad, я обновил свой пост, иначе я хотел бы выбрать свой баннер из бэк-офиса, чтобы только баннер с isActive true получал свои изображения и отображал их в баннере, поэтому, пожалуйста, уточните, если это возможно, брат

Ответ №1:

Проблема устранена

     public function activeBanner()
{
    return
        $this->createQueryBuilder('image')
            ->leftJoin('image.banner', 'banner')
            ->andWhere('banner.isActive = :isActive')
            ->setParameter('isActive', true)
            ->getQuery()
            ->execute();
}
  

Это правильный QueryBuilder, и он должен быть в репозитории изображений, надеюсь, мое решение поможет другим разработчикам стека