我想自動添加列(在我所有的物體中),如'lastEditedTime'和'createdTime'到DQL查詢,但我不知道這是否可行?
我已經做了一個SQLFilter來添加約束,但沒有找到一個解決方案來自動添加列到每個結果中。
有人有辦法嗎?
謝謝你
uj5u.com熱心網友回復:
從你的問題來看,并不完全清楚你想實作什么。你想為物體添加共享/共同的屬性嗎?這可以通過擴展一個共同的父類來實作。
或者,如果物體類沒有/不能擴展一個共同的父類,你可以使用一個trait來向你的類添加共同的代碼。
下面的例子顯示了如何使用一個共同的父類呼叫和HasLifecycleCallbacks,它將負責自動更新時間戳:
示例:
/**。
* @ORMMappedSuperclass
* @HasLifecycleCallbacks */
*/
抽象 class TimeLoggedEntity {
/**。
* @ORMColumn(type="datetime", nullable=true)
*/
protected $lastEditedTime;
/**。
* @ORMColumn(type="datetime", nullable=true)
*/
protected $createdTime;
...
/**。
* @ORMPrePersist
*/
public function prePersist() {
$this-> createdTime = DateTime();
$this->lastEditedTime = DateTime()。
}
/**。
* @ORMPreUpdate
*/
public function preUpdate(){
$this->lastEditedTime = DateTime()。
}
}
/**。
* @ORMEntity
*/
class SomeEntityA extends TimeLoggedEntity{
/**。
* @ORMColumn(type="string", nullable=true)
*/
protected $someProperty。
}
/**.
* @ORMEntity
*/
class OtherEntityB extends TimeLoggedEntity{
/**。
* @ORMColumn(type="string", nullable=true)
*/
protected $otherProperty;
}
在這個例子中,Doctrine將為SomeEntityA和OtherEntityB創建表,這兩個表都有你的時間戳列。
請注意,TimeLoggedEntity不一定是抽象的。
uj5u.com熱心網友回復:
添加SQL的過濾器 更多資訊請查看symfonycast
<?php
namespace Example;
use DoctrineORMMappingClassMetadata,
DoctrineORMQueryFilterSQLFilter。
class MyLocaleFilter extends SQLFilter
{
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
//檢查該物體是否實作了LocalAware介面。
if (!$targetEntity->reflClass-> implementsInterface('LocaleAware') {
return ""。
}
return $targetTableAlias.'.locale = ' . $this->getParameter('locale'); //getParameter自動應用引號。
}
}
Hooks :
<?php
/** @Entity @HasLifecycleCallbacks */
class User */
{
//span> ...
/**。
* @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 = 'change from prePersist callback!';
}
/** @PostPersist */
public function doStuffOnPostPersist()
{
$this->value = 'change from postPersist callback!';
}
/** @PostLoad */
public function doStuffOnPostLoad()
{
$this->value = 'change from postLoad callback!';
}
/** @PreUpdate */
public function doStuffOnPreUpdate()。
{
$this->value = 'change from preUpdate callback!';
}
這將允許你在需要的時候撰寫邏輯。
也有Doctrine事件,如果你的邏輯很復雜或者你想移出并單獨管理代碼,你可以利用它。
如果你有能力改變模式,你可以使用預構建的特質,該特質具有你所需要的所有邏輯,正如在《中國》中描述的那樣 教義擴展包,并避免重寫許多常見用例的邏輯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/310765.html
標籤:
