1 つのフィールドからではなく、複数のフィールドから検索するための検索フィルターを作成することはできますCONCAT(name, description)
か?
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper->add('search');
}
1 つのフィールドからではなく、複数のフィールドから検索するための検索フィルターを作成することはできますCONCAT(name, description)
か?
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper->add('search');
}
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;
}
@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));
}
}
}