Привязка сущностей к параметрам запроса разрешена только для сущностей, имеющих идентификатор - PullRequest
1 голос
/ 13 марта 2019

У меня есть сущность У Annonce есть теги ManyToMany to Entity Tag

Когда я ищу Annonce по тегам, подобным этой *

enter image description here

Моя проблема: например, если в базе данных существуют теги Bike, которые будут возвращать Annonces с этим тегом, без ошибок

Если я добавлю, например, теги типа «Car», то в базе данных их нет, ошибкаПоявляются:

Привязка сущностей к параметрам запроса разрешена только для сущностей, имеющих идентификатор.

Это в моем контроллере

$annonces = $repository->findListByFilter($data->getTags());

и этоЭто хранилище

public function findListByFilter($tags):array
{
    return $this->createQueryBuilder('c')
        ->innerJoin('c.tags', 'tags')
        ->where('tags IN (:value)')
        ->setParameter(':value', $tags)
        ->getQuery()->getResult();
}

есть решение для этой проблемы?

---------- Дополнительная информация --------------- Tag Entity

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\TagRepository")
 */
class Tag
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

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

    public function getTitre(): ?string
    {
        return $this->titre;
    }

    public function setTitre(string $titre): self
    {
        $this->titre = $titre;

        return $this;
    }

    public function __toString()
    {
        return $this->titre;
    }
}

Annonce Entity

namespace App\Entity;

use App\Tag\Taggable;
class Annonce
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    public function __construct()
    {

        $this->tags = new ArrayCollection();

    }

    use Taggable;
}

Класс Taggable

use App\Entity\Tag;

trait Taggable
{

    /**
     * @var array
     *php bin/console make:entity --regenerate App
     * @ORM\ManyToMany(targetEntity="App\Entity\Tag", cascade={"persist"})
     */
    private $tags;

    /**
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getTags()
    {
        return $this->tags;
    }

    public function addTag(tag $tag)
    {
        if (!$this->tags->contains($tag)) {
            $this->tags[] = $tag;
        }
        return $this;
    }

    public function removeTag(tag $tag)
    {
        if ($this->tags->contains($tag)) {
            $this->tags->removeElement($tag);
        }

    }

    public function __construct()
    {
        $this->tags = new ArrayCollection();
    }
}

1 Ответ

1 голос
/ 13 марта 2019

Здесь вы можете сделать любой из этих двух вариантов:

  1. Сохраните этот новый тег также в БД, затем перейдите к findListByFilter()

  2. Не сохраняйте новый тег, но изменяйте:

В контроллере:

$annonces = $repository->findListByFilter($data->getTags());

В хранилище:

public function findListByFilter($tags):array
{
    $tagsText = [];
    foreach ($tags as $tag) {
      $tagsText[] = $tag->getTitre();
    }

    return $this->createQueryBuilder('c')
        ->innerJoin('c.tags', 'tags')
        ->where('tags.titre IN (:value)')
        ->setParameter(':value', $tagsText)
        ->getQuery()->getResult();
}

I 'м, при условии, что у объекта тега есть текстовое поле.

...