如何在Symfony中构建Doctrine内连接查询

4
我正在开发一个Symfony项目,想要为这个SQL创建Doctrine查询语句。
用户表: 列 - 昵称
评论表: 列 - 用户ID , 评论, 创建时间
谢谢。
SELECT
`USER`.NICK_NAME,
REVIEWS.REVIEW,
REVIEWS.CREATED_AT
FROM
REVIEWS
INNER JOIN `USER` ON REVIEWS.USER_ID = `USER`.ID
WHERE
REVIEWS.MOVIE_ID = 625
GROUP BY
REVIEWS.USER_ID

我尝试过类似于这样的事情

    $q = Doctrine_Query::create()
            ->select("u.NICK_NAME,r.REVIEW,r.CREATED_AT")
            ->from('REVIEWS r')
            ->innerJoin('`USER` ON REVIEWS.USER_ID = `USER`.ID')
            ->where('REVIEWS.MOVIE_ID = 625')
            ->groupBy('REVIEWS.USER_ID');

我得到了这个:
500 | Internal Server Error | Doctrine_Exception Couldn't find class `USER`

您的查询将返回不确定结果,因为您在查询中使用了group by而没有任何聚合函数来处理审阅列。 - M Khalid Junaid
1
但这没有意义,因为如果我运行那个SQL语句,它会返回我想要的结果。我尝试了一些类似的DQL语句。 - Mayura Wijewickrama
2个回答

2

在Symfony中,您可以使用简单的SQL而不是复杂的DQL。在您想要运行DQL的控制器中尝试使用此函数。

 function getUserReviews($params) {
        $query = "SELECT REVIEWS.REVIEW, `USER`.NICK_NAME, REVIEWS.CREATED_AT FROM REVIEWS INNER JOIN `USER` ON REVIEWS.USER_ID = `USER`.ID WHERE REVIEWS.MOVIE_ID ='".$params."'";
        return Doctrine_Manager::getInstance()->getCurrentConnection()->fetchAssoc($query);
    }

1

在DQL查询中,应该指定实体名称而不是表名,像这样:YourBundleName:EntityName

使用方法如下:

$q = Doctrine_Query::create()
            ->select("u.NICK_NAME,r.REVIEW,r.CREATED_AT")
            ->from('REVIEWS r')
            ->innerJoin('YourBundleName:EntityName ON REVIEWS.USER_ID = `USER`.ID')
            ->where('REVIEWS.MOVIE_ID = 625')
            ->groupBy('REVIEWS.USER_ID');

如果以上解决方案不起作用,可以尝试以下备选方案:

$q = Doctrine_Query::create()
                ->select("u.NICK_NAME,r.REVIEW,r.CREATED_AT")
                ->from('REVIEWS r')
                ->innerJoin('YourBundleName:EntityName', 'USER_ID')
                ->where('REVIEWS.MOVIE_ID = 625')
                ->groupBy('REVIEWS.USER_ID');

如果那不起作用,可以按照以下方式使用内部连接(Inner join):
->InnerJoin('YourBundleName:Entity', '<alias>', Expr\Join::ON, $qb->expr()->eq('IDENTITY(<alias.<clummn_name>)', '<comapring_column>')) 

Doctrine2文档中的内联接:

示例 -

$qb->innerJoin('u.Group', 'g', Expr\Join::WITH, qb->expr()->eq('u.status_id', '?1'))

$qb->innerJoin('u.Group', 'g', 'WITH', 'u.status = ?1')

$qb->innerJoin('u.Group', 'g', 'WITH', 'u.status = ?1', 'g.id')

innerJoin 方法原型:

innerJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null);

在这里查找更多信息

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接