【问题标题】:Omines datatables custom query doesn't workOmines 数据表自定义查询不起作用
【发布时间】:2022-01-16 01:50:10
【问题描述】:

我正在使用 bundle Omines 在 Symfony 5 中创建 DataTables,并且我已经编写了一个自定义查询。但是,当我这样做时,视图中的搜索不起作用。

我该如何解决?

这是我的代码:

控制器

$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 别名。我已经尝试过这样的自定义条件查询:

 ->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(),
                ],
            ])

但我不确定如何检索数据表搜索字段的值以用作“%%”中的参数

【问题讨论】:

  • 你能补充一点信息吗?你的搜索词是什么?默认 criteria_query 将在已选择的实体 IIRC 中的每个单独字段中进行搜索。但是,由于您使用的是 CONCAT,它可能会出错,并且还需要提供自定义的。
  • 搜索词是全名别名。我尝试过使用这样的自定义条件查询:'criteria' => [ function (QueryBuilder $builder) { $builder->andWhere($builder->expr()->like('CONCAT(p.firstName, \' \ ', p.middleName, \' \', p.lastName)', ':fullName'))->setParameter('fullName', '%%'); }, new SearchCriteriaProvider(), ],但我不确定如何检索数据表搜索字段的值以用作“%%”中的参数
  • 还有第二个DataTableState 参数传递给函数,您可以使用它来检索搜索词:function (QueryBuilder $builder, DataTableState $state) { $term = $state-&gt;getGlobalSearch(); }
  • 太棒了!正是我想要的,问题解决了。谢谢:)

标签: symfony datatables doctrine


【解决方案1】:

解决方案:

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(),
                ],
            ])

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2016-10-05
  • 2021-01-10
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
相关资源
最近更新 更多