【问题标题】:Symfony2 / Doctrine2 SQL Select Clause with ConditionSymfony2 / Doctrine2 SQL Select 有条件的子句
【发布时间】:2012-04-30 17:14:24
【问题描述】:

我正在 Symfony2 中创建一个表单,我想用自定义查询的结果填充下拉列表。这是一个示例php代码:

<?php
public function buildForm(FormBuilder $builder, array $options)
{
    $builder
        //...
        ->add('type', 'entity', array(
            'class'         => 'EventBundle:Event',
            'query_builder' => function (EntityRepository $er) {
                return $er
                    ->createQueryBuilder('e')
                    ->add('select', 'e.id, CONCAT(IF (e.modified > NOW(), "Pending: ", ""), e.name) as name')
                ;
            }
        ))
    ;
}
?>

我找不到设置此 SELECT 子句的方法。我正在寻找类似于 Zend 框架中的“new Zend_Db_Expr(...)”的东西。 有没有一种方法可以使用复杂的 SELECT 子句创建此查询,而无需将其键入为本机 SQL 代码?

提前谢谢你!

【问题讨论】:

    标签: sql symfony doctrine-orm native


    【解决方案1】:

    嗯,您提供的查询应该是 DQL,而不是 SQL。

    看到 IF() 是not valid DQL,我不确定你能做些什么来解决这个问题。也许让实体类本身通过property option 进行连接?

    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            //...
            ->add('type', 'entity', array(
                'class'         => 'EventBundle:Event',
                'property'      => 'modifiedName',
            ))
        ;
    }
    

    然后在 EventBundle\Entity\Event 中

    public function getModifiedName()
    {
      return $this->modified > new \DateTime() 
        ? 'Pending: ' . $this->getName()
        : $this->getName()
      ;
    }
    

    【讨论】:

    • 是的,我的问题基本上是如何使用DQL在SELECT子句中写IF和CONCAT。如果“IF”在 DQL 中无效,那么我应该坚持使用 PHP 逻辑的建议,尽管我的意见是,通常如果可以在数据库中完成某些事情,则应该在数据库中完成,而不是在 PHP 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2023-03-15
    • 2012-09-14
    相关资源
    最近更新 更多