将实体绑定到仅具有标识符

时间:2019-03-13 08:31:10

标签: mysql sql symfony symfony4 symfony-4.2

我有一个实体Annonce将标记ManyToMany标记为实体标记

当我通过类似这张图片的标签搜索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();
}

有解决此问题的解决方案吗?

----------其他信息------------------- 标签实体

<?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;
    }
}

匿名实体

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;
}

可标记类别

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 个答案:

答案 0 :(得分:1)

您可以在此处执行以下两个选项之一:

  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();
}

我在这里假设标签实体具有字段文本。