首页 > 解决方案 > 始终在学说 DQL 中获得列

问题描述

我想向 DQL 查询自动添加列(在我的所有实体中),例如“lastEditedTime”和“createdTime”,但我不知道这是否可能?

我已经做了一个 SQLFilter 来添加约束,但没有找到自动向每个结果添加列的解决方案......

有人有想法吗?

问候

标签: symfonydoctrinedql

解决方案


最好的方法之一是使用扩展或过滤器实体管理器挂钩

过滤以添加 SQL 更多关于它们的信息,请查看symfonycast

<?php
namespace Example;
use Doctrine\ORM\Mapping\ClassMetadata,
    Doctrine\ORM\Query\Filter\SQLFilter;

class MyLocaleFilter extends SQLFilter
{
    public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
    {
        // Check if the entity implements the LocalAware interface
        if (!$targetEntity->reflClass->implementsInterface('LocaleAware')) {
            return "";
        }

        return $targetTableAlias.'.locale = ' . $this->getParameter('locale'); // getParameter applies quoting automatically
    }
}

挂钩:

<?php

/** @Entity @HasLifecycleCallbacks */
class User
{
    // ...

    /**
     * @Column(type="string", length=255)
     */
    public $value;

    /** @Column(name="created_at", type="string", length=255) */
    private $createdAt;

    /** @PrePersist */
    public function doStuffOnPrePersist()
    {
        $this->createdAt = date('Y-m-d H:i:s');
    }

    /** @PrePersist */
    public function doOtherStuffOnPrePersist()
    {
        $this->value = 'changed from prePersist callback!';
    }

    /** @PostPersist */
    public function doStuffOnPostPersist()
    {
        $this->value = 'changed from postPersist callback!';
    }

    /** @PostLoad */
    public function doStuffOnPostLoad()
    {
        $this->value = 'changed from postLoad callback!';
    }

    /** @PreUpdate */
    public function doStuffOnPreUpdate()
    {
        $this->value = 'changed from preUpdate callback!';
    }
}

这将允许您在所需的点编写逻辑。

也有 Doctrine Events,如果您的逻辑很复杂或者您想移出并单独管理代码,您可以使用它们。

如果您有能力更改架构,则可以使用预构建的特征,该特征具有您需要的所有逻辑,如 原则扩展包中所述,并避免为许多常见用例重写逻辑。


推荐阅读