Filterを使って強制的にWHERE句を追加する。
ここでは del_flg = 0
使用例 SoftDeleteFilter
SQLFilter の定義
/src/Eccube/Doctrine/Filter/SoftDeleteFilter.php
<?php
namespace Eccube\Doctrine\Filter;
use Doctrine\ORM\Query\Filter\SQLFilter;
use Doctrine\ORM\Mapping\ClassMetadata;
class SoftDeleteFilter extends SQLFilter
{
public $excludes = array();
public function setExcludes($excludes)
{
$this->excludes = $excludes;
return $this;
}
public function getExcludes()
{
return $this->excludes;
}
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
if ($targetEntity->hasField('del_flg') && !in_array($targetEntity->getName(), $this->getExcludes())) {
return $targetTableAlias . '.del_flg = 0';
} else {
return "";
}
}
}
CartService
/src/Eccube/Service/CartService.php
<?php
//////// 省略 ////////
/**
* カートに保存されている商品の ProductClass エンティティを読み込み、カートへ設定します。
*/
protected function loadProductClassFromCart()
{
/* @var $softDeleteFilter \Eccube\Doctrine\Filter\SoftDeleteFilter */
$softDeleteFilter = $this->entityManager->getFilters()->getFilter('soft_delete');
$excludes = $softDeleteFilter->getExcludes();
// ここからProductClassエンティティのクエリに強制的にdel_flg = 0 を追加する。
$softDeleteFilter->setExcludes(array(
'Eccube\Entity\ProductClass',
));
foreach ($this->cart->getCartItems() as $CartItem) {
$this->loadProductClassFromCartItem($CartItem);
}
// del_flg = 0 追加分を削除( 元に戻す作業 )
$softDeleteFilter->setExcludes($excludes);
}
参考
オブジェクト取得過程
参考.php
<?php
$this->entityManager->getFilters()->getFilter('soft_delete');
get_class($this->entityManager); // "Doctrine\ORM\EntityManager"
get_class($this->entityManager->getFilters()); // "Doctrine\ORM\Query\FilterCollection"