我遵循数据库结构:
列表项 行程(ManyToMany to table trips_tags 上的标签( +----+----------------+ |身份证 | 姓名 | +----+----------------+ | 1 |捷克共和国 | | 2 |德国 | | 2 ]波兰 | +----+----------------+ 标签 +----+-----------+ |身份证 | 姓名 | +----+-----------+ | 1 |山脉 | | 2 |海滩 | | 2 ]城市 | +----+-----------+ trips_tags +----------+---------+ |trips_id |tags_id | +----------+---------+ | 1 | 1 | | 1 | 2 | | 2 ] 1 | +----------+---------+
我需要选择具有我指定的所有标签的行程。
- 需要旅行标签 山作为海滩 我只得到捷克共和国。
- 只需要旅行标签山脉,得到捷克共和国和波兰
我写了一个简单的 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 DoctrineCommonCollectionsArrayCollection();
}
// ...
}
/** @Entity */
class Tag
{
// ...
/**
* @ManyToMany(targetEntity="Trip", mappedBy="tags")
*/
private $trips;
public function __construct() {
$this->trips = new DoctrineCommonCollectionsArrayCollection();
}
// ...
}
然后使用一些聚合构建您的 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();
多对多,双向
教义2 在没有关系的情况下获取对象
Symfony2 - Doctrine2 QueryBuilder 在 ManyToMany 字段中
的位置