symfony - 始终在学说 DQL 中获得列
问题描述
我想向 DQL 查询自动添加列(在我的所有实体中),例如“lastEditedTime”和“createdTime”,但我不知道这是否可能?
我已经做了一个 SQLFilter 来添加约束,但没有找到自动向每个结果添加列的解决方案......
有人有想法吗?
问候
解决方案
过滤以添加 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,如果您的逻辑很复杂或者您想移出并单独管理代码,您可以使用它们。
如果您有能力更改架构,则可以使用预构建的特征,该特征具有您需要的所有逻辑,如 原则扩展包中所述,并避免为许多常见用例重写逻辑。