5

1 つのフィールドからではなく、複数のフィールドから検索するための検索フィルターを作成することはできますCONCAT(name, description)か?

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper->add('search');
}
4

3 に答える 3

5

doctrine_orm_callback タイプの解決策を見つけました

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{


    $datagridMapper
        ->add( 'text', 'doctrine_orm_callback', array(
            'callback' => array($this, 'getSearchFilter'),
            'field_type' => 'text'
        ) );
}

public function getSearchFilter($queryBuilder, $alias, $field, $value) {
    if (!$value['value']) {
        return;
    }

    $exp = new \Doctrine\ORM\Query\Expr();
    $queryBuilder->andWhere($exp->like($exp->concat($alias.'.name', $alias.'.description'), $exp->literal('%' . $value['value'] . '%')));

    return true;
}    
于 2013-01-31T13:37:48.147 に答える
1

@webDEVILopers の回答に基づいて、任意のフィールドで使用できる汎用クラスを次に示します。

use Doctrine\ORM\Query\Expr;
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
use Sonata\DoctrineORMAdminBundle\Filter\BooleanFilter;

class MultiStringFilter extends BooleanFilter
{
    /**
     * @param string $field should be in the form field1-field2-…-fieldn
     */
    public function filter(ProxyQueryInterface $queryBuilder, $alias, $field, $data)
    {
        $fields = explode('-', $field);
        $filterActive = $data['value'];
        if ($filterActive === null) {
            return;
        }

        $subConditions = [];
        foreach ($fields as $field) {

            $subConditions[] = $queryBuilder->expr()->like(
                "LOWER($alias.$field)",
                $queryBuilder->expr()->literal('%' . strtolower($data['value']) . '%')
            );
        }

        if (count($subConditions) > 1) {
            $queryBuilder->andWhere(new Expr\Orx($subConditions));
        }
    }
}
于 2016-01-18T14:50:22.047 に答える