使用 findBy 返回空数组集合

时间:2021-05-27 04:03:12

标签: symfony

我需要从数据库中找到一行,我正在使用 findOneBy()

当我循环遍历集合时,

findBy()findOneBy() 以及任何其他 symfony 函数总是为我的 ManyToOne 相关实体返回一个空数组集合。

但是当使用 findAll() 函数并且我遍历集合时,它返回预期的数据。

您会在问题末尾找到控制器函数,其中包含我使用过但不起作用的不同 find 函数。

下面列出的实体:

news 实体与 newsBlocks 实体相关,而 newsBlocks 与 legalNotices 实体相关。

它们都是多对一/一对多关系。

新闻实体

<?php

namespace Honda\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

/**
 * News
 *
 * @ORM\Table(name="news")
 * @ORM\Entity(repositoryClass="Honda\MainBundle\Repository\NewsRepository")
 */
class News
{

    use Traits\DistributorTrait,
        Traits\StartDateEndDateTrait,
        Traits\HomeActivationTrait,
        Traits\ActivationTrait,
        Traits\RedirectionTrait;

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

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

    /**
     * @var string
     *
     * @Assert\NotBlank()
     * @ORM\Column(name="description1", type="text", nullable=true)
     */
    private $description1;

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

    /**
     * @Gedmo\Slug(fields={"title"})
     * @ORM\Column(unique=true)
     */
    private $slug;

    /**
     *
     * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media",  cascade={"all"}, fetch="LAZY")
     * @ORM\JoinColumn(name="image", referencedColumnName="id", onDelete="SET NULL", nullable=true)
     */
    protected $image;

    /**
     *
     * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media",  cascade={"all"}, fetch="LAZY")
     * @ORM\JoinColumn(name="image_mobile", referencedColumnName="id", onDelete="SET NULL", nullable=true)
     */
    protected $image_mobile;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="created_at", type="datetime", nullable=true)
     */
    protected $createdAt;

    /**
     * @Gedmo\SortablePosition
     * @ORM\Column(name="position", type="integer")
     */
    private $position;

    /**
     * @ORM\OneToMany(targetEntity="Honda\MainBundle\Entity\NewsBlocks", mappedBy="news", cascade={"persist"})
     */
    private $newsBlocks;

    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->createdAt = new \DateTime('NOW', new \DateTimeZone('Europe/Paris'));
        $this->slides = new ArrayCollection();
        $this->newsBlocks = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * @return string
     */
    public function __toString()
    {
        if ($this->getId()) {
            return $this->getTitle();
        }

        return '';
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set title
     *
     * @param string $title
     *
     * @return News
     */
    public function setTitle($title)
    {
        $this->title = $title;

        return $this;
    }

    /**
     * Get title
     *
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * Set description1
     *
     * @param string $description1
     *
     * @return News
     */
    public function setDescription1($description1)
    {
        $this->description1 = $description1;

        return $this;
    }

    /**
     * Get description1
     *
     * @return string
     */
    public function getDescription1()
    {
        return $this->description1;
    }

    /**
     * Set type
     *
     * @param integer $type
     *
     * @return News
     */
    public function setType($type)
    {
        $this->type = $type;

        return $this;
    }

    /**
     * Get type
     *
     * @return integer
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * Set image
     *
     * @param \Application\Sonata\MediaBundle\Entity\Media $image
     *
     * @return News
     */
    public function setImage(\Application\Sonata\MediaBundle\Entity\Media $image = null)
    {
        $this->image = $image;

        return $this;
    }

    /**
     * Get image
     *
     * @return \Application\Sonata\MediaBundle\Entity\Media
     */
    public function getImage()
    {
        return $this->image;
    }


    /**
     * Set slug
     *
     * @param string $slug
     *
     * @return News
     */
    public function setSlug($slug)
    {
        $this->slug = $slug;

        return $this;
    }

    /**
     * Get slug
     *
     * @return string
     */
    public function getSlug()
    {
        return $this->slug;
    }

    /**
     * Set createdAt
     *
     * @param \DateTime $createdAt
     * @return News
     */
    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;

        return $this;
    }

    /**
     * Get createdAt
     *
     * @return \DateTime
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    /**
     * Set position
     *
     * @param integer $position
     *
     * @return ALaUne
     */
    public function setPosition($position)
    {
        $this->position = $position;

        return $this;
    }

    /**
     * Get position
     *
     * @return integer
     */
    public function getPosition()
    {
        return $this->position;
    }

    /**
     * Set imageMobile.
     *
     * @param \Application\Sonata\MediaBundle\Entity\Media|null $imageMobile
     *
     * @return News
     */
    public function setImageMobile(\Application\Sonata\MediaBundle\Entity\Media $imageMobile = null)
    {
        $this->image_mobile = $imageMobile;

        return $this;
    }

    /**
     * Get imageMobile.
     *
     * @return \Application\Sonata\MediaBundle\Entity\Media|null
     */
    public function getImageMobile()
    {
        return $this->image_mobile;
    }

        /**
     * Add newsBlock.
     *
     * @param \Honda\MainBundle\Entity\NewsBlocks $newsBlock
     *
     * @return NewNews
     */
    public function addNewsBlock(\Honda\MainBundle\Entity\NewsBlocks $newsBlock)
    {
        if (!$this->newsBlocks->contains($newsBlock)) {
            $this->newsBlocks[] = $newsBlock;
            $newsBlock->setNews($this);
        }
        
        return $this;
    }

    /**
     * Remove newsBlock.
     *
     * @param \Honda\MainBundle\Entity\NewsBlocks $newsBlock
     *
     * @return boolean TRUE if this collection contained the specified element, FALSE otherwise.
     */
    public function removeNewsBlock(\Honda\MainBundle\Entity\NewsBlocks $newsBlock)
    {
        if (!$this->newsBlocks->contains($newsBlock)) {
            return;
        }

        $this->newsBlocks->removeElement($newsBlock);
        $newsBlock->setNews(null);

        return $this;
    }

    /**
     * Get newsBlocks.
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getNewsBlocks()
    {
        return $this->newsBlocks;
    }

}

新闻区块

<?php

namespace Honda\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

use  Honda\MainBundle\Entity\Traits;
use Doctrine\Common\Collections\ArrayCollection;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 * NewsBlocks
 *
 * @ORM\Table(name="news_blocks")
 * @ORM\Entity(repositoryClass="Honda\MainBundle\Repository\NewsBlocksRepository")
 */
class NewsBlocks
{
    use Traits\DistributorTrait;

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

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

    /**
     * @ORM\OneToMany(targetEntity="Honda\MainBundle\Entity\News\Offer", mappedBy="newsBlockOffer", cascade={"all"})
     */
    private $offers;

    /**
     * @ORM\OneToMany(targetEntity="Honda\MainBundle\Entity\News\Video", mappedBy="newsBlockVideo", cascade={"persist"})
     */
    private $videos;

    /**
     * @ORM\OneToMany(targetEntity="Honda\MainBundle\Entity\News\LegalNotices", mappedBy="newsBlockLegalNotices", cascade={"persist"})
     */
    private $legalNotices;

    /**
     * @ORM\OneToMany(targetEntity="Honda\MainBundle\Entity\News\OfferCarousel", mappedBy="newsOfferBlocks", cascade={"persist"})
     */
    private $offerCarousels;

    /**
     * @ORM\ManyToOne(targetEntity="Honda\MainBundle\Entity\News", inversedBy="newsBlocks", cascade={"persist"})
     */
    private $news;

    /**
     * @ORM\OneToMany(targetEntity="Honda\MainBundle\Entity\News\PhotoSlider", mappedBy="newsPhotoSliderBlock", cascade={"persist"})
     */
    private $photoSliders;

    /**
     * @ORM\Column(name="position", type="integer")
     */
    private $position;

    /**
     * Get id.
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->offers = new \Doctrine\Common\Collections\ArrayCollection();
        $this->videos = new \Doctrine\Common\Collections\ArrayCollection();
        $this->legalNotices = new \Doctrine\Common\Collections\ArrayCollection();
        $this->offerCarousels = new \Doctrine\Common\Collections\ArrayCollection();
        $this->photoSliders = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add offer.
     *
     * @param \Honda\MainBundle\Entity\News\Offer $offer
     *
     * @return NewsBlocks
     */
    public function addOffer(\Honda\MainBundle\Entity\News\Offer $offer)
    {
        if (!$this->offers->contains($offer)) {
            $this->offers[] = $offer;
            $offer->setNewsBlockOffer($this);
        }

        return $this;
    }

    /**
     * Remove offer.
     *
     * @param \Honda\MainBundle\Entity\News\Offer $offer
     *
     * @return boolean TRUE if this collection contained the specified element, FALSE otherwise.
     */
    public function removeOffer(\Honda\MainBundle\Entity\News\Offer $offer)
    {
        if (!$this->offers->contains($offer)) {
            return;
        }

        $this->offers->removeElement($offer);
        $offer->setNewsBlockOffers(null);

        return $this;
    }

    /**
     * Get offers.
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getOffers()
    {
        return $this->offers;
    }

    /**
     * Add video.
     *
     * @param \Honda\MainBundle\Entity\News\Video $video
     *
     * @return NewsBlocks
     */
    public function addVideo(\Honda\MainBundle\Entity\News\Video $video)
    {
        if (!$this->videos->contains($video)) {
            $this->videos[] = $video;
            $video->setNewsBlockVideo($this);
        }

        return $this;
    }

    /**
     * Remove video.
     *
     * @param \Honda\MainBundle\Entity\News\Video $video
     *
     * @return boolean TRUE if this collection contained the specified element, FALSE otherwise.
     */
    public function removeVideo(\Honda\MainBundle\Entity\News\Video $video)
    {
        if (!$this->videos->contains($video)) {
            return;
        }

        $this->videos->removeElement($video);
        $video->setNewsBlockVideo(null);

        return $this;
    }

    /**
     * Get videos.
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getVideos()
    {
        return $this->videos;
    }

    /**
     * Set blockName.
     *
     * @param string $blockName
     *
     * @return NewsBlocks
     */
    public function setBlockName($blockName)
    {
        $this->blockName = $blockName;

        return $this;
    }

    /**
     * Get blockName.
     *
     * @return string
     */
    public function getBlockName()
    {
        return $this->blockName;
    }

    /**
     * Add legalNotice.
     *
     * @param \Honda\MainBundle\Entity\News\LegalNotices $legalNotice
     *
     * @return NewsBlocks
     */
    public function addLegalNotice(\Honda\MainBundle\Entity\News\LegalNotices $legalNotice)
    {
        if (!$this->legalNotices->contains($legalNotice)) {
            $this->legalNotices[] = $legalNotice;
            $legalNotice->setNewsBlockLegalNotices($this);
        }
        
        return $this;
    }

    /**
     * Remove legalNotice.
     *
     * @param \Honda\MainBundle\Entity\News\LegalNotices $legalNotice
     *
     * @return boolean TRUE if this collection contained the specified element, FALSE otherwise.
     */
    public function removeLegalNotice(\Honda\MainBundle\Entity\News\LegalNotices $legalNotice)
    {
        if (!$this->legalNotices->contains($legalNotice)) {
            return;
        }

        $this->legalNotices->removeElement($legalNotice);
        $legalNotice->setUniqueLook(null);

        return $this;
    }

    /**
     * Get legalNotices.
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getLegalNotices()
    {
        return $this->legalNotices;
    }

    /**
     * Add offerCarousel.
     *
     * @param \Honda\MainBundle\Entity\News\OfferCarousel $offerCarousel
     *
     * @return NewsBlocks
     */
    public function addOfferCarousel(\Honda\MainBundle\Entity\News\OfferCarousel $offerCarousel)
    {
        if (!$this->offerCarousels->contains($offerCarousel)) {
            $this->offerCarousels[] = $offerCarousel;
            $offerCarousel->setNewsOfferBlocks($this);
        }
        
        return $this;
    }

    /**
     * Remove offerCarousel.
     *
     * @param \Honda\MainBundle\Entity\News\OfferCarousel $offerCarousel
     *
     * @return boolean TRUE if this collection contained the specified element, FALSE otherwise.
     */
    public function removeOfferCarousel(\Honda\MainBundle\Entity\News\OfferCarousel $offerCarousel)
    {
        if (!$this->offerCarousels->contains($offerCarousel)) {
            return;
        }

        $this->offerCarousels->removeElement($offerCarousel);
        $offerCarousel->setNewsOfferBlocks(null);

        return $this;
    }

    /**
     * Get offerCarousels.
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getOfferCarousels()
    {
        return $this->offerCarousels;
    }

    /**
     * Set news.
     *
     * @param \Honda\MainBundle\Entity\News|null $news
     *
     * @return NewsBlocks
     */
    public function setNews(\Honda\MainBundle\Entity\News $news = null)
    {
        $this->news = $news;

        return $this;
    }

    /**
     * Get news.
     *
     * @return \Honda\MainBundle\Entity\News|null
     */
    public function getNews()
    {
        return $this->news;
    }

    /**
     * Add photoSlider.
     *
     * @param \Honda\MainBundle\Entity\News\PhotoSlider $photoSlider
     *
     * @return NewsBlocks
     */
    public function addPhotoSlider(\Honda\MainBundle\Entity\News\PhotoSlider $photoSlider)
    {
        if (!$this->photoSliders->contains($photoSlider)) {
            $this->photoSliders[] = $photoSlider;
            $photoSlider->setNewsPhotoSliderBlock($this);
        }

        return $this;
    }

    /**
     * Remove photoSlider.
     *
     * @param \Honda\MainBundle\Entity\News\PhotoSlider $photoSlider
     *
     * @return boolean TRUE if this collection contained the specified element, FALSE otherwise.
     */
    public function removePhotoSlider(\Honda\MainBundle\Entity\News\PhotoSlider $photoSlider)
    {
        if (!$this->photoSliders->contains($photoSlider)) {
            return;
        }

        $this->photoSliders->removeElement($photoSlider);
        $photoSlider->setNewsPhotoSliderBlock(null);
    }

    /**
     * Get slides.
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getPhotoSliders()
    {
        return $this->photoSliders;
    }

    /**
     * Set position.
     *
     * @param int $position
     *
     * @return NewsBlocks
     */
    public function setPosition($position)
    {
        $this->position = $position;

        return $this;
    }

    /**
     * Get position.
     *
     * @return int
     */
    public function getPosition()
    {
        return $this->position;
    }
}

法律声明

<?php

namespace Honda\MainBundle\Entity\News;

use Doctrine\ORM\Mapping as ORM;

use Honda\MainBundle\Entity\Traits;

/**
 * LegalNotices
 *
 * @ORM\Table(name="news_legal_notices")
 * @ORM\Entity(repositoryClass="Honda\MainBundle\Repository\News\LegalNoticesRepository")
 */
class LegalNotices
{
    use Traits\DistributorTrait,
        Traits\ActivationTrait;

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

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

    /**
     * @ORM\ManyToOne(targetEntity="Honda\MainBundle\Entity\NewsBlocks", inversedBy="legalNotices", cascade={"persist"})
     */
    private $newsBlockLegalNotices;

    /**
     * Get id.
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set description.
     *
     * @param string $description
     *
     * @return LegalNotices
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description.
     *
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Set newsBlockLegalNotices.
     *
     * @param \Honda\MainBundle\Entity\NewsBlocks|null $newsBlockLegalNotices
     *
     * @return LegalNotices
     */
    public function setNewsBlockLegalNotices(\Honda\MainBundle\Entity\NewsBlocks $newsBlockLegalNotices = null)
    {
        $this->newsBlockLegalNotices = $newsBlockLegalNotices;

        return $this;
    }

    /**
     * Get newsBlockLegalNotices.
     *
     * @return \Honda\MainBundle\Entity\NewsBlocks|null
     */
    public function getNewsBlockLegalNotices()
    {
        return $this->newsBlockLegalNotices;
    }
}

这是我在控制器中的函数:

    /**
     * @Route("/actualites/{slug}", name="news_show_article", requirements={"slug": "[a-zA-Z0-9\-]+"})
     */
    public function articleAction(Request $request, $slug)
    {
        $em = $this->getDoctrine()->getManager();

        $news = $em->getRepository(News::class)->findBy(['slug' => $slug]); // Return specific row but collection emtpy
        $news = $em->getRepository(News::class)->findOneBy(['slug' => $slug]); // Return specific row but collection emtpy


        $news = $em->getRepository(News::class)->findBy([], ['createdAt' => 'DESC']); // Return all but collection empty

        $r = $news[16]->getNewsBlocks();
        foreach ($r as $item) {
            dump($item);
        }

        $news = $em->getRepository(News::class)->findAll(); // Return all and collection is not emtpy

        $r = $news[16]->getNewsBlocks();
        foreach ($r as $item) {
            foreach($item->getOffers() as $offer) {
                dump($offer);
            }
        }
}

0 个答案:

没有答案