Omines 数据表自定义查询不起作用
Omines datatables custom query doesn't work
我正在使用捆绑包 Omines 在 Symfony 5 中创建数据表,并且我编写了一个自定义查询。但是,当我这样做时,视图中的搜索不起作用。
我该如何解决?
这是我的代码:
控制器
$table = $dataTableFactory->create()
->add('fullName', TextColumn::class, [
'label' => 'Full Name',
'propertyPath' => '[fullName]',
'searchable' => true,
])
->createAdapter(ORMAdapter::class, [
'entity' => Person::class,
'hydrate' => AbstractQuery::HYDRATE_ARRAY,
'query' => function (QueryBuilder $builder) {
$builder
->select('p.id, CONCAT(p.firstName, \' \', p. middleName, \' \', p.lastName) AS fullName')
->from(Person::class, 'p');
},
])
->handleRequest($request);
if ($table->isCallback()) {
return $table->getResponse();
}
return $this->render('person/index.html.twig', [
'datatable' => $table,
]);
datatables.html.twig
{% extends 'base.html.twig' %}
{% block stylesheets %}
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/bs5/jq-3.6.0/dt-1.11.2/b-2.0.0/fh-3.1.9/r-2.2.9/datatables.min.css"/>
{% endblock %}
{% block javascripts %}
<script type="text/javascript" src="https://cdn.datatables.net/v/bs5/jq-3.6.0/dt-1.11.2/b-2.0.0/fh-3.1.9/r-2.2.9/datatables.min.js"></script>
<script src="{{ asset('bundles/datatables/js/datatables.js') }}"></script>
<script>
$(function () {
$('#table').initDataTables({{ datatable_settings(datatable) }}, {
searching: true,
fixedHeader: true,
responsive: true,
});
});
</script>
{% endblock %}
index.html.twig
{% extends 'datatables.html.twig' %}
{% block title %}List{% endblock %}
{% block body %}
<div id="table">Loading...</div
{% endblock %}
编辑
搜索词是 fullName 别名。我试过像这样自定义 criteria_query:
->createAdapter(ORMAdapter::class, [
'entity' => Person::class,
'hydrate' => AbstractQuery::HYDRATE_ARRAY,
'query' => function (QueryBuilder $builder) {
$builder
->select('p.id, CONCAT(p.firstName, \' \', p. middleName, \' \', p.lastName) AS fullName')
->from(Person::class, 'p');
},
'criteria' => [
function (QueryBuilder $builder) {
$builder->andWhere($builder->expr()->like('CONCAT(p.firstName, \' \', p.middleName, \' \', p.lastName)', ':fullName'))->setParameter('fullName', '%%');
},
new SearchCriteriaProvider(),
],
])
但我不确定如何检索要在“%%”中用作参数的数据表搜索字段的值
解决方案:
use Doctrine\ORM\AbstractQuery;
use Doctrine\ORM\QueryBuilder;
use Omines\DataTablesBundle\Adapter\Doctrine\ORMAdapter;
use Omines\DataTablesBundle\DataTableState;
....
->createAdapter(ORMAdapter::class, [
'entity' => Person::class,
'hydrate' => AbstractQuery::HYDRATE_ARRAY,
'query' => function (QueryBuilder $builder) {
$builder
->select('p.id, CONCAT(p.firstName, \' \', p. middleName, \' \', p.lastName) AS fullName')
->from(Person::class, 'p');
},
'criteria' => [
function (QueryBuilder $builder, DataTableState $state) {
$term = strtolower($state->getGlobalSearch());
$builder->andWhere($builder->expr()->like('LOWER(CONCAT(p.firstName, \' \', p.middleName, \' \', p.lastName))', ':fullName'))->setParameter('fullName', '%' . $term . '%');
},
new SearchCriteriaProvider(),
],
])
我正在使用捆绑包 Omines 在 Symfony 5 中创建数据表,并且我编写了一个自定义查询。但是,当我这样做时,视图中的搜索不起作用。
我该如何解决?
这是我的代码:
控制器
$table = $dataTableFactory->create()
->add('fullName', TextColumn::class, [
'label' => 'Full Name',
'propertyPath' => '[fullName]',
'searchable' => true,
])
->createAdapter(ORMAdapter::class, [
'entity' => Person::class,
'hydrate' => AbstractQuery::HYDRATE_ARRAY,
'query' => function (QueryBuilder $builder) {
$builder
->select('p.id, CONCAT(p.firstName, \' \', p. middleName, \' \', p.lastName) AS fullName')
->from(Person::class, 'p');
},
])
->handleRequest($request);
if ($table->isCallback()) {
return $table->getResponse();
}
return $this->render('person/index.html.twig', [
'datatable' => $table,
]);
datatables.html.twig
{% extends 'base.html.twig' %}
{% block stylesheets %}
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/bs5/jq-3.6.0/dt-1.11.2/b-2.0.0/fh-3.1.9/r-2.2.9/datatables.min.css"/>
{% endblock %}
{% block javascripts %}
<script type="text/javascript" src="https://cdn.datatables.net/v/bs5/jq-3.6.0/dt-1.11.2/b-2.0.0/fh-3.1.9/r-2.2.9/datatables.min.js"></script>
<script src="{{ asset('bundles/datatables/js/datatables.js') }}"></script>
<script>
$(function () {
$('#table').initDataTables({{ datatable_settings(datatable) }}, {
searching: true,
fixedHeader: true,
responsive: true,
});
});
</script>
{% endblock %}
index.html.twig
{% extends 'datatables.html.twig' %}
{% block title %}List{% endblock %}
{% block body %}
<div id="table">Loading...</div
{% endblock %}
编辑
搜索词是 fullName 别名。我试过像这样自定义 criteria_query:
->createAdapter(ORMAdapter::class, [
'entity' => Person::class,
'hydrate' => AbstractQuery::HYDRATE_ARRAY,
'query' => function (QueryBuilder $builder) {
$builder
->select('p.id, CONCAT(p.firstName, \' \', p. middleName, \' \', p.lastName) AS fullName')
->from(Person::class, 'p');
},
'criteria' => [
function (QueryBuilder $builder) {
$builder->andWhere($builder->expr()->like('CONCAT(p.firstName, \' \', p.middleName, \' \', p.lastName)', ':fullName'))->setParameter('fullName', '%%');
},
new SearchCriteriaProvider(),
],
])
但我不确定如何检索要在“%%”中用作参数的数据表搜索字段的值
解决方案:
use Doctrine\ORM\AbstractQuery;
use Doctrine\ORM\QueryBuilder;
use Omines\DataTablesBundle\Adapter\Doctrine\ORMAdapter;
use Omines\DataTablesBundle\DataTableState;
....
->createAdapter(ORMAdapter::class, [
'entity' => Person::class,
'hydrate' => AbstractQuery::HYDRATE_ARRAY,
'query' => function (QueryBuilder $builder) {
$builder
->select('p.id, CONCAT(p.firstName, \' \', p. middleName, \' \', p.lastName) AS fullName')
->from(Person::class, 'p');
},
'criteria' => [
function (QueryBuilder $builder, DataTableState $state) {
$term = strtolower($state->getGlobalSearch());
$builder->andWhere($builder->expr()->like('LOWER(CONCAT(p.firstName, \' \', p.middleName, \' \', p.lastName))', ':fullName'))->setParameter('fullName', '%' . $term . '%');
},
new SearchCriteriaProvider(),
],
])