【问题标题】:DQL - Merge custom value within entityDQL - 合并实体内的自定义值
【发布时间】:2015-03-06 23:25:16
【问题描述】:

太好了,我的 DQL 查询有问题...

->createQuery(
    "SELECT cjr, cjr.microtimeEnd - cjr.microtimeStart AS duration
        FROM Application\Entity\CronJobResultEntity cjr"
)

这可行,但现在我得到一个数组作为响应,但我想要实体中的“持续时间”值(或者换句话说......成为该实体的一部分),这意味着它应该是这样的:

->createQuery(
    "SELECT cjr, cjr.microtimeEnd - cjr.microtimeStart AS cjr.duration
        FROM Application\Entity\CronJobResultEntity cjr"
)

但这会引发异常:

QueryException in QueryException.php line 52:
[Syntax Error] line 0, col 56: Error: Expected Doctrine\ORM\Query\Lexer::T_FROM, got '.'

有人知道如何解决这个问题吗?

【问题讨论】:

  • 实体中是否有持续时间字段?
  • 不,就像在上面的示例中看到的那样,它是“动态”计算的。编辑:还尝试将字段添加到实体。没有帮助。
  • 您是否可以选择更改数据库结构或原始实体代码?
  • 是的,我可以使用展位。

标签: symfony doctrine dql


【解决方案1】:

所以,您所做的更多是一种 SQL 方法。要使其更像 DQL,请在您的实体代码中添加“持续时间”以及 getter 和 setter:

/**
 * @var string
 */
private $duration;

/**
 * Get duration
 *
 * @return
 */

public function getDuration() {
     return $this->duration;
}

/**
 * Set duration
 *
 * @param
 * @return $this
 */
public function setDuration($duration) {
    $this->duration = $duration;
    return $this;
}

使用您的第一个查询。

->createQuery(
    "SELECT cjr, cjr.microtimeEnd - cjr.microtimeStart AS duration
        FROM Application\Entity\CronJobResultEntity cjr"
);

然后得到结果。

$result = $query->getResult();

最后通过它们来设置数据(如果它对你更有意义,你也可以做 foreach)。

array_map(
    function($r){
        $r->setDuration($r->getMicroTimeEnd() - $r->getMicroTimeStart());
    }, &$result);

如果有意义,您也可以将其持久化到数据库中(通过修改 orm 字段然后持久化)。

【讨论】:

  • 谢谢。是的,我也教过这个选项,但我需要 DQL 方法,因为我使用 knp 排序组件,并且只接受查询(除此之外,我还希望代码尽可能少:))跨度>
  • 您可能需要为此编写一个自定义水合器。或者将持续时间字段添加为数据库表的一部分。
  • 所以实际上不可能通过 DQL 以某种方式直接合并/设置自定义值(到现有实体)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多