Php 将带有子查询的SQL转换为条令查询生成器

Php 将带有子查询的SQL转换为条令查询生成器,php,doctrine-orm,query-builder,Php,Doctrine Orm,Query Builder,我有以下数据库结构: List item trips (ManyToMany to tags over table trips_tags) +----+----------------+ | id | name | +----+----------------+ | 1 | Czech Republic | | 2 | Germany | | 3 | Poland | +----+----------------+ tags +----

我有以下数据库结构:

List item trips (ManyToMany to tags over table trips_tags) +----+----------------+ | id | name | +----+----------------+ | 1 | Czech Republic | | 2 | Germany | | 3 | Poland | +----+----------------+ tags +----+-----------+ | id | name | +----+-----------+ | 1 | Mountains | | 2 | Beach | | 3 | City | +----+-----------+ trips_tags +----------+---------+ | trips_id | tags_id | +----------+---------+ | 1 | 1 | | 1 | 2 | | 3 | 1 | +----------+---------+ 现在我在用DQL编写SQL时遇到了一个问题。有人能帮忙吗


谢谢

看起来trips和标签之间存在多对多关系,最好按照条令的方式定义实体,并尽可能多地将它们关联起来

class Trip
{
    // ...

    /**
     * @ManyToMany(targetEntity="Tag", inversedBy="trips")
     * @JoinTable(name="trip_tag")
     */
    private $tags;

    public function __construct() {
        $this->tag s= new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

/** @Entity */
class Tag
{
    // ...
    /**
     * @ManyToMany(targetEntity="Trip", mappedBy="tags")
     */
    private $trips;

    public function __construct() {
        $this->trips = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}
然后使用一些聚合构建您的DQL

$tagIds = [1,2];
$qb = $this->createQueryBuilder('trip');
$qb ->addSelect('COUNT(tags.id) AS total_tags')
    ->leftJoin('trip.tags', 'tags')
    ->add('where', $qb->expr()->in('tags', $tagIds))
    ->groupBy('trip.id')
    ->having('total_tags = @numberOfTags')
    ->getQuery()
    ->getResult();


您在什么框架下工作?通常,如果您使用条令,您将创建实体类,并使用条令PHP注释,并在这些类中创建关系。你不应该写这样一个赤裸裸的查询。每件事都应该按照原则来处理。我在内特FW工作。我对实体的设计没有问题,但我不知道如何在DQL中创建查询:)公平地说,我不清楚您是否得到了该部分。是的,它看起来不错,可以工作,但我需要获取Trips实体数组?现在我只得到了total_标签值的数组。有可能吗?@I您可以在查询中添加
->select('trip')
以获取Tripsy集合,我们正在接近:)现在我得到数组,其中每个项目都有两个键->trip实体和total_标记值。是否可以删除total_tags key并只获得清晰的行程数组?Thx alot@iwory我想你需要手动转换它,但对此不确定。
$tagIds = [1,2];
$qb = $this->createQueryBuilder('trip');
$qb ->addSelect('COUNT(tags.id) AS total_tags')
    ->leftJoin('trip.tags', 'tags')
    ->add('where', $qb->expr()->in('tags', $tagIds))
    ->groupBy('trip.id')
    ->having('total_tags = @numberOfTags')
    ->getQuery()
    ->getResult();