将带有子查询的 SQL 转换为 Doctrine Query Builder
Convert SQL with subquery to Doctrine Query Builder
我有以下数据库结构:
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 |
+----------+---------+
我需要 select 行程,其中包含我指定的所有标签。
- 需要将山脉标记为海滩的旅行我只得到捷克共和国。
- 只需要为标记山脉旅行,获得捷克共和国和波兰
我写了个简单的SQL
SELECT trip.name, trip.id
FROM trips AS trip
WHERE (
SELECT COUNT(trip_tag.tags_id)
FROM trips_tags AS trip_tag
WHERE trip_tag.tags_id IN (1, 2)
AND trip_tag.trips_id = trip.id
) = numberOfTags`
现在我在用 DQL 编写 SQL 时遇到了问题。有人可以帮忙吗?
谢谢
看起来你在旅行和标签之间有多对多的关系,最好采用教义方式定义你的实体并将它们关联起来,就像
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();
Symfony2 - Doctrine2 QueryBuilder WHERE IN ManyToMany field
我有以下数据库结构:
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 | +----------+---------+
我需要 select 行程,其中包含我指定的所有标签。
- 需要将山脉标记为海滩的旅行我只得到捷克共和国。
- 只需要为标记山脉旅行,获得捷克共和国和波兰
我写了个简单的SQL
SELECT trip.name, trip.id
FROM trips AS trip
WHERE (
SELECT COUNT(trip_tag.tags_id)
FROM trips_tags AS trip_tag
WHERE trip_tag.tags_id IN (1, 2)
AND trip_tag.trips_id = trip.id
) = numberOfTags`
现在我在用 DQL 编写 SQL 时遇到了问题。有人可以帮忙吗?
谢谢
看起来你在旅行和标签之间有多对多的关系,最好采用教义方式定义你的实体并将它们关联起来,就像
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();
Symfony2 - Doctrine2 QueryBuilder WHERE IN ManyToMany field