【问题标题】:Symfony2 simple query: can't fetch an object, only arraySymfony2 简单查询:无法获取对象,只能获取数组
【发布时间】:2015-02-11 07:13:12
【问题描述】:

Symfony2.6 中的以下查询使用 getArrayResult();但不适用于 getResult();或 getOneOrNullResult();。这意味着我无法获取对象,只能获取数组。
如果我使用这个查询,我得到的只是一个白色/空白页面(甚至不是 symfony 调试工具栏)。请注意,在我的树枝模板中,我只是对查询结果进行了 {{ dump() }}。

表格结构很简单(是用户阅读的书籍列表):
ID、用户、书籍、状态、投票、评论
(用户、书籍和状态是外键)

public function selectOneRecordBy2Ids($user_id, $book_id)
{
    /* @var $qb QueryBuilder */
    $qb = $this->createQueryBuilder('l');
    $qb->select('l');
    $qb = $qb->Where($qb->expr()->eq('l.user', ':first'));
    $qb = $qb->andWhere($qb->expr()->eq('l.book', ':second'));
    $qb = $qb->setParameters(array('first' => $user_id, 'second' => $book_id));
    return $qb->getQuery()->getOneOrNullResult();



}

【问题讨论】:

  • 空白页表示您有一些 PHP 错误,因此请先检查您的 error.log 文件。
  • 你有没有尝试强制idration模式调用return $qb->getQuery()->getOneOrNullResult(Query::HYDRATE_OBJECT);
  • 感谢您的帮助...请在第一个答案下阅读我的 cmets.. 似乎错误不在查询中,而是在使用 twig {{ dump(var) }} 的结果转储中。

标签: symfony


【解决方案1】:

我注意到这里有一些不好的做法,所以让我纠正它们:

public function selectOneRecordBy2Ids(User $user, Book $book)
{
    /* @var $qb QueryBuilder */
    $qb = $this->createQueryBuilder('l');
    $qb
        ->andWhere($qb->expr()->eq('l.user', ':first'))
        ->andWhere($qb->expr()->eq('l.book', ':second'))
        ->setParameters(array('first' => $user, 'second' => $book));
    return $qb->getQuery()->getResult();
}

如果您只使用一个实体并且不获取任何关系,则不需要选择。 QB 返回$this,因此您可以链接方法调用。

尝试使用实体作为参数而不是原始类型(如果可能的话)。如果不是,那么您必须在 QB 中使用原始类型作为原始类型。在这种情况下,您需要一些连接:

->select('l')
->join('l.user', 'u')
->join('l.book', 'b')
->andWhere($qb->expr()->eq('u.id', ':first'))
->andWhere($qb->expr()->eq('b.id', ':second'))
->setParameters(array('first' => $user_id, 'second' => $book_id));

如果您只想获取一条记录,那么您可能必须通过设置最大结果来限制结果:

->setMaxResults(1)

我希望这有助于并解决您最初的问题。

【讨论】:

  • 首先,非常感谢您的好建议。我尝试了第二种方法,但它不起作用(可能是我的错)。附:你确定我应该使用 u.id 和 b.id 而不是 l.user 和 l.book?
  • l.userl.book 表示实体而不是基元类型,我相信加入表格并引用它们的 id-s 是这里的最佳实践。您可以在问题中发布您的实体吗?问题可能在那里,因为我看不到,为什么您的查询失败。
  • 我刚刚发现了一些东西......如果在另一个树枝文件中我使用 {{ dump(query_result) }} 的查询可以正常工作,我会得到同样的错误。所以,我认为问题不在于查询本身,而在于 var_dump twig 函数。例如看到这个mossco.co.uk/symfony-2/how-to-fix-twig-whitescreen-on-dump-var。奇怪的是 getArrayResult 不会发生这种情况
  • 检查由上述查询(使用 getResult 或 getOneOrNullResult)检索到的数据的最佳方法是什么? {{ dump(var) }} 对我不起作用,并且 php var_dump 打印出一些不太容易阅读的内容。
  • 通常我在这种情况下使用 xdebug。这是一个设置 xdebug 和使用 PhpStorm 调试的教程:jetbrains.com/phpstorm/help/configuring-xdebug.html 当然你也可以将它配置为使用 Netbeans 进行调试。
【解决方案2】:

getOneOrNullResult() 不会返回记录,但会告诉您是否在数据库中找到任何记录。 您可能想使用getSingleResult()

【讨论】:

  • 其实有结果就返回一行。这两种方法的区别在于如果没有结果,则getSingleResult() 抛出异常,而getOneOrNullResult() 只返回null
猜你喜欢
  • 2018-04-16
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多