我有一个post
表,它的架构是这样的:
CREATE TABLE IF NOT EXISTS `post` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) DEFAULT NULL,
`site_id` bigint(20) DEFAULT NULL,
`parent_id` bigint(20) DEFAULT NULL,
`title` longtext COLLATE utf8_turkish_ci NOT NULL,
`status` varchar(20) COLLATE utf8_turkish_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `IDX_5A8A6C8DA76ED395` (`user_id`),
KEY `IDX_5A8A6C8DF6BD1646` (`site_id`),
KEY `IDX_5A8A6C8D727ACA70` (`parent_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=16620 ;
我正在使用这个DQL来获取一个帖子,它是孩子们:
$post = $this->_diContainer->wordy_app_doctrine->fetch(
"SELECT p,c FROM Wordy\Entity\Post p LEFT JOIN p.children c WHERE p.site = :site AND p.id = :id AND p.language = :language AND p.status != 'trashed' AND c.status != 'trashed' ORDER BY c.title",
array(
'params' => array(
'id' => $id,
'site' => $this->_currentSite['id'],
'language' => $this->_currentLanguage->code,
)
)
);
我要做的是:获取一个帖子及其所有孩子。标准是,不包括破坏的帖子或被遗弃的儿童。
但是当我使用一个甚至没有孩子的帖子运行此查询时,返回的结果集为空。
当我从查询中删除c.status != 'trashed'
部分时,一切正常但我也会收到删除的帖子。
提前谢谢。
编辑:这是给定DQL的SQL输出:
SELECT p0_.id AS id0, p0_.title AS title5, p0_.status AS status8, p0_.parent_id AS parent_id9, p1_.id AS id15, p1_.title AS title20, p1_.status AS status23, p1_.parent_id AS parent_id24 FROM post p0_ LEFT JOIN post p1_ ON p0_.id = p1_.parent_id WHERE p0_.site_id = ? AND p0_.id = ? AND p0_.language = ? AND p0_.status <> 'trashed' ORDER BY p1_.title ASC
答案 0 :(得分:1)
您的长条件WHERE在加入后正在进行AND运算,并且没有任何内容通过所有检查。将连接内容移动到ON子句中,并在WHERE子句中保留c.trashed检查。尝试这样的事情:
SELECT p,c FROM Wordy\Entity\Post p LEFT JOIN children c ON p.site = :site AND p.id = :id AND p.language = :language AND p.status != 'trashed' AND p.id = c.parent_id WHERE c.status != 'trashed' ORDER BY c.title
答案 1 :(得分:1)
您忘记了left join syntax的ON
条款。
答案 2 :(得分:1)
我想我解决了自己的问题。
只需在with
字段而不是join
子句中使用where
子句,如下所示:
"SELECT p,c FROM Wordy\Entity\Post p LEFT JOIN p.children c WITH c.status != 'trashed' WHERE p.site = :site........."