嵌套 select 在 Phalcon 的查询生成器中

nested select in Phalcon's query builder

我有两个表,Website 和 user_website_map

我想 select 具有嵌套 select 条件的网站

代码是这样的

$query = \Website::query()->addWhere('id in (SELECT user_website_map.website_id from security.user_website_map where user_id = :userId )', [':userId' =>  $this->getId()]) ;
        return $query->execute();

这个语句抛出异常

Phalcon\Mvc\Model\Exception: Syntax error, unexpected token SELECT, near to ' user_website_map.website_id from security.user_website_map where user_id = :userId )', when parsing: SELECT [Website].* FROM [Website] WHERE id in (SELECT user_website_map.website_id from security.user_website_map where user_id = :userId ) (138)

如果我从数据库控制台执行此查询,不会发生错误。

SELECT  * FROM main.website WHERE  id in (SELECT user_website_map.website_id from security.user_website_map where user_id = 2)

有关信息,我使用的是 postgresql-9.4 和 Phalcon 1.3.4 这个陈述有什么问题?

这个查询可以——而且应该——通过连接而不是子查询来完成:

$query = \Website->query()
    ->join('UserWebsiteMap') // replace with actual model name
    ->where('user_id = :user_id:', array('user_id' => $this->getId()));

虽然我对 MySQL 比对 PostgreSQL 更熟悉,但我相信对于这两个数据库来说,相对于连接,子查询对性能都有负面影响。有关原因的解释,请参阅以下 link:Join vs. sub-query.