php - Doctrine DQL 子查询给出零结果

标签 php mysql symfony doctrine-orm

我在 Mysql 服务器上有三个相关实体:Group、GroupDefault、GroupDefaultTranslation。

  • Group 实体存储用户的组。
  • GroupDefault 实体定义任何用户的默认组。
  • GroupDefaultTranslation 实体存储默认组的翻译。

实体之间的关系是类型: - Group 和 GroupDefault 之间的 ManyToOne - OneToManu ent GroupsDefault 和 GroupDefaultTranslation

我的目标是显示用户的组列表,并在其语言参数中显示相应的翻译。

这是我的 QueryBuilder,生成了 DQL 查询:

public function findByOwnerWithLanguage($languageCode, $ownerId)
{
        $qb = $this->createQueryBuilder('g')
            ->select('g.name')
            ->addSelect('gdt.content AS name')
            ->join('g.parent', 'gd')
            ->join('gd.translations', 'gdt')
            ->where('g.owner = :owner');

            //création de l'expression AND
            $orModule = $qb->expr()->andX();
            $orModule->add($qb->expr()->eq('g.parent', '0'));
            $orModule->add($qb->expr()->eq('gdt.locale', ':language'));
            $orModule->add($qb->expr()->eq('g.owner', ':owner'));


         //Ajout de l'expression à la requête
         $qb->orWhere($orModule)
            ->setParameter('language', $languageCode, \PDO::PARAM_STR)
            ->setParameter('owner', $ownerId)
            ->orderBy('g.isMyLightbox', 'DESC')
            ->getQuery()
            ->getResult();
    return $qb;

    // DQL Query :

    // SELECT g.name, gdt.content AS name
    // FROM Horyou\Bundle\CoreBundle\Entity\Group g
    // INNER JOIN g.parent gd
    // INNER JOIN gd.translations gdt
    // WHERE g.owner = :owner
    // OR (g.parent = 0 AND gdt.locale = :language AND g.owner = :owner)
    // ORDER BY g.isMyLightbox DESC

}

这是对象 var_dump 的输出:

object(stdClass)[1368]
  public '__CLASS__' => string 'Doctrine\ORM\QueryBuilder' (length=25)
  public '_em' => 
    object(stdClass)[1362]
      public '__CLASS__' => string 'Doctrine\ORM\EntityManager' (length=26)
      public 'config' => string 'Doctrine\ORM\Configuration' (length=26)
      public 'conn' => string 'Doctrine\DBAL\Connection' (length=24)
      public 'metadataFactory' => string 'Doctrine\ORM\Mapping\ClassMetadataFactory' (length=41)
      public 'unitOfWork' => string 'Doctrine\ORM\UnitOfWork' (length=23)
      public 'eventManager' => string 'Symfony\Bridge\Doctrine\ContainerAwareEventManager' (length=50)
      public 'proxyFactory' => string 'Doctrine\ORM\Proxy\ProxyFactory' (length=31)
      public 'repositoryFactory' => string 'Doctrine\ORM\Repository\DefaultRepositoryFactory' (length=48)
      public 'expressionBuilder' => string 'Doctrine\ORM\Query\Expr' (length=23)
      public 'closed' => boolean false
      public 'filterCollection' => string 'Doctrine\ORM\Query\FilterCollection' (length=35)
  public '_dqlParts' => 
    array (size=9)
      'distinct' => boolean false
      'select' => string 'Array(2)' (length=8)
      'from' => string 'Array(1)' (length=8)
      'join' => string 'Array(1)' (length=8)
      'set' => string 'Array(0)' (length=8)
      'where' => string 'Doctrine\ORM\Query\Expr\Orx' (length=27)
      'groupBy' => string 'Array(0)' (length=8)
      'having' => null
      'orderBy' => string 'Array(1)' (length=8)
  public '_type' => int 0
  public '_state' => int 1
  public '_dql' => string 'SELECT g.name, gdt.content AS name FROM Horyou\Bundle\CoreBundle\Entity\Group g INNER JOIN g.parent gd INNER JOIN gd.translations gdt WHERE g.owner = :owner OR (g.parent = 0 AND gdt.locale = :language AND g.owner = :owner) ORDER BY g.isMyLightbox DESC' (length=251)
  public 'parameters' => 
    array (size=2)
      0 => string 'Doctrine\ORM\Query\Parameter' (length=28)
      1 => string 'Doctrine\ORM\Query\Parameter' (length=28)
  public '_firstResult' => null
  public '_maxResults' => null
  public 'joinRootAliases' => 
    array (size=2)
      'gd' => string 'g' (length=1)
      'gdt' => string 'g' (length=1)

我的问题是结果为零。 有人看到我的 QueryBuilder 中的错误是什么吗?

最佳答案

实际上这不是结果 - 它只是查询构建器对象的转储。我认为你必须做这样的事情:

...
$qb->orWhere($orModule)
        ->setParameter('language', $languageCode, \PDO::PARAM_STR)
        ->setParameter('owner', $ownerId)
        ->orderBy('g.isMyLightbox', 'DESC');
$result = $qb->getQuery()->getResult();

return $result;

关于php - Doctrine DQL 子查询给出零结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28481248/

相关文章:

php - 如何在目录中制作列表文件并使用php下载它们

mysql - 将mysql中的bind-address更改为公共(public)服务器IP会降低性能吗?

php - Symfony 如何将参数传递到 yaml 配置中?

php - 使用通配符清除 apcu

symfony - 包含中的 Twig 绝对路径变量

php - 如何配置 PHPStan 以避免由特定类和/或魔术方法引起的误报?

php - 使用define()存储数据库连接详细信息是好是坏?

php - 设置 PostgreSQL 实例的时区

MySQL - 慢查询 - wp_options 表。网站无法处理流量

php - 将 PHP mysql 库从 mysqlnd 更改为 libmysql(用于 SSL 连接)