0
私は関係ManyToMantの写真とタグを持っていて、いくつかのタグIDを持っている写真を見つける必要がありますが、私は2つのタグid(1,2) ID 1のタグを持つ写真。タグIDがいくつかある写真を見つけるには?Symfony Doctrine ManyToMany関係を使ってクエリを作成する
は私のエンティティthisis
class Photo
{
use Timestampable;
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @Annotation\Groups({
* "get_photo"
* })
*/
private $id;
/**
* @var Tags[]|ArrayCollection
* @ORM\ManyToMany(targetEntity="Tags", inversedBy="photo")
* @Annotation\Type("Relation<AppBundle\Entity\Tags>")
* @Annotation\SerializedName("tag_ids")
* @Annotation\Accessor(setter="setSerializedTag")
* @Annotation\Groups({
* "post_photo", "get_photo", "put_photo"
* })
*/
protected $tags;
とタグ
class Tags
{
use Timestampable;
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @Annotation\Groups({"get_tag"})
*/
private $id;
/**
* @var Photo[]|ArrayCollection
*
* @ORM\ManyToMany(targetEntity="Photo", mappedBy="tags")
*/
protected $photo;
と$parameterBag->get('tag_ids')
例では、私のクエリ、[1、2]:
/**
* {@inheritdoc}
*/
public function getPhotoByParameters(
ParameterBag $parameterBag,
) {
$em = $this->getEntityManager();
$qb = $em->createQueryBuilder();
$qb
->select('p')
->from('AppBundle:Photo', 'p')
->leftJoin('p.tags', 't');
if ($parameterBag->get('tag_ids') !== null
&& is_array($tagIds = $parameterBag->get('tag_ids'))
) {
$qb->andWhere($qb->expr()->in('t.id', $parameterBag->get('tag_ids')));
}
$query = $qb->getQuery();
$results = $query->getResult();
return $results;
}
と
結果に私が持っている必要があります後タグ1とタグID 2を持つ写真。id 1のタグだけでなく、2 のタグときに」のようなものを持っている。このようにしようとすると、GET = 1つの、タグID、私は私の写真
をして応答を持っているときに私は、0写真(GET> 1タグID)を持っている
$andX = $qb->expr()->andX();
foreach ($tagIds as $id) {
$andX->add($qb->expr()->eq('t.id', $id));
}
$qb->andWhere($andX);
してみてくださいクエリ
この 'IS_ARRAYを(持っている場合は、実施例1及び2
@keyboardSmasherこのパラメータをもっときれいにするためのあなたの提案は何ですか? –
私はそれが変数を定義する地獄であると言っています。 – keyboardSmasher