LoginSignup
1
1

More than 5 years have passed since last update.

【ECCUBE3】DoctrineのFilter

Posted at

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"

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1