Datatables Omines - Глубина> 2, поддержка множественных отношений с функциями заказа / поиска - PullRequest
0 голосов
/ 31 октября 2019

Я попытался заставить это работать:

$table = $this->createDataTable()
                ->add('firstname', TextColumn::class, ['label' => 'Vorname', 'orderable'=> true, 'field' => 'personalData.firstname'])
                ->add('lastname', TextColumn::class, ['label' => 'Nachname', 'orderable'=> true, 'field' => 'personalData.lastname'])
                ->add('email', TextColumn::class, ['label' => 'Nachname', 'orderable'=> true, 'field' => 'personalData.lastname'])
                ->add('phone', TextColumn::class, ['label' => 'Telefon', 'orderable'=> true, 'field' => 'personalData.phone'])
                ->add('mobilePhone', TextColumn::class, ['label' => 'Mobil', 'orderable'=> true, 'field' => 'personalData.mobilePhone'])
                ->add('gender', TextColumn::class, ['label' => 'Gender', 'orderable'=> true, 'field' => 'personalData.gender.abbreviation'])
                ->add('lastModified', DateTimeColumn::class, ['label' => 'letzte Änderung', 'orderable'=> true, 'format' => 'd.m.Y H:i:s'])
                ->add('dateCreated', DateTimeColumn::class, ['label' => 'Datum Erstellung', 'orderable'=> true, 'format' => 'd.m.Y H:i:s'])
                ->add('actions', TextColumn::class, ['label' => 'Aktionen', 'orderable'=> false, 'render' => function($value, $context) {
                        $user_id = $context->getId();
                        return sprintf('<button type="button" data-user-id="%s" class="btn btn-primary edit-user-btn"><i class="fas fa-pencil-alt fa-fw fa-fw"></i></button><button type="button" data-user-id="%s" class="btn btn-danger del-user-btn margin-left-10"><i class="fas fa-trash fa-fw fa-fw"></i></button>', $user_id, $user_id);
                    }])
                ->createAdapter(ORMAdapter::class, [
            'entity' => User::class,
        ]);

Это приводит к следующей ошибке: Catchable Fatal Error: Объект класса App \ Entity \ Gender не может быть преобразован в строку

В качестве обходного пути я мог бы добавить метод __toString к сущности, но, к сожалению, он не решает проблему, так что этот столбец также можно заказать.

Затем я попробовал этот подход:

$table = $this->createDataTable()
                ->add('firstname', TextColumn::class, ['label' => 'Vorname', 'orderable'=> true, 'field' => 'personalData.firstname'])
                ->add('lastname', TextColumn::class, ['label' => 'Nachname', 'orderable'=> true, 'field' => 'personalData.lastname'])
                ->add('email', TextColumn::class, ['label' => 'Nachname', 'orderable'=> true, 'field' => 'personalData.lastname'])
                ->add('phone', TextColumn::class, ['label' => 'Telefon', 'orderable'=> true, 'field' => 'personalData.phone'])
                ->add('mobilePhone', TextColumn::class, ['label' => 'Mobil', 'orderable'=> true, 'field' => 'personalData.mobilePhone'])
                ->add('gender', TextColumn::class, ['label' => 'Geschlecht', 'orderable'=> true, 'render' => function($value ,$context) {
                        $user_id = $context->getId();

                        $user = $this->getDoctrine()
                                ->getRepository(User::class)
                                ->findOneBy(['id' => $user_id]);

                        return $user->getPersonalData()->getGender()->getAbbreviation();
                    }])
                ->add('lastModified', DateTimeColumn::class, ['label' => 'letzte Änderung', 'orderable'=> true, 'format' => 'd.m.Y H:i:s'])
                ->add('dateCreated', DateTimeColumn::class, ['label' => 'Datum Erstellung', 'orderable'=> true, 'format' => 'd.m.Y H:i:s'])
                ->add('actions', TextColumn::class, ['label' => 'Aktionen', 'orderable'=> false, 'render' => function($value, $context) {
                        $user_id = $context->getId();
                        return sprintf('<button type="button" data-user-id="%s" class="btn btn-primary edit-user-btn"><i class="fas fa-pencil-alt fa-fw fa-fw"></i></button><button type="button" data-user-id="%s" class="btn btn-danger del-user-btn margin-left-10"><i class="fas fa-trash fa-fw fa-fw"></i></button>', $user_id, $user_id);
                    }])
                ->createAdapter(ORMAdapter::class, [
            'entity' => User::class,
        ]);

СейчасЯ вижу загрузку таблицы, но если я пытаюсь упорядочить таблицу, я получаю следующее сообщение об ошибке:

Doctrine\ORM\Query\QueryException:
[Syntax Error] line 0, col -1: Error: Expected Doctrine\ORM\Query\Lexer::T_IDENTIFIER, got end of string.

  at vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:54
  at Doctrine\ORM\Query\QueryException::syntaxError('line 0, col -1: Error: Expected Doctrine\\ORM\\Query\\Lexer::T_IDENTIFIER, got end of string.', object(QueryException))
     (vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:457)
  at Doctrine\ORM\Query\Parser->syntaxError('Doctrine\\ORM\\Query\\Lexer::T_IDENTIFIER')
     (vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:325)
  at Doctrine\ORM\Query\Parser->match(102)
     (vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:1022)
  at Doctrine\ORM\Query\Parser->ResultVariable()
     (vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:1521)
  at Doctrine\ORM\Query\Parser->OrderByItem()
     (vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:1408)
  at Doctrine\ORM\Query\Parser->OrderByClause()
     (vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:884)
  at Doctrine\ORM\Query\Parser->SelectStatement()
     (vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:848)
  at Doctrine\ORM\Query\Parser->QueryLanguage()
     (vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:261)
  at Doctrine\ORM\Query\Parser->getAST()
     (vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:360)
  at Doctrine\ORM\Query\Parser->parse()
     (vendor/doctrine/orm/lib/Doctrine/ORM/Query.php:286)
  at Doctrine\ORM\Query->_parse()
     (vendor/doctrine/orm/lib/Doctrine/ORM/Query.php:234)
  at Doctrine\ORM\Query->getResultSetMapping()
     (vendor/doctrine/orm/lib/Doctrine/ORM/AbstractQuery.php:902)
  at Doctrine\ORM\AbstractQuery->iterate(array(), 1)
     (vendor/doctrine/orm/lib/Doctrine/ORM/Query.php:689)
  at Doctrine\ORM\Query->iterate(array(), 1)
     (vendor/omines/datatables-bundle/src/Adapter/Doctrine/ORMAdapter.php:205)
  at Omines\DataTablesBundle\Adapter\Doctrine\ORMAdapter->getResults(object(Query))
     (vendor/omines/datatables-bundle/src/Adapter/AbstractAdapter.php:51)
  at Omines\DataTablesBundle\Adapter\AbstractAdapter->getData(object(DataTableState))
     (vendor/omines/datatables-bundle/src/DataTable.php:372)
  at Omines\DataTablesBundle\DataTable->getResultSet()
     (vendor/omines/datatables-bundle/src/DataTable.php:331)
  at Omines\DataTablesBundle\DataTable->getResponse()
     (src/Controller/UsersController.php:100)
  at App\Controller\UsersController->getUsers(object(Request))
     (vendor/symfony/http-kernel/HttpKernel.php:151)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
     (vendor/symfony/http-kernel/HttpKernel.php:68)
  at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
     (vendor/symfony/http-kernel/Kernel.php:198)
  at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
     (public/index.php:24)

Итак, у меня есть сущность «Пользователь», и это имеет отношение к сущности «personalData». "- кроме того," personalData "имеет отношение к" полу "-> я хочу, чтобы данные о половой принадлежности отображались в таблицах данных, и чтобы функционал порядка и поиска работал

Есть ли обходной путь или этоошибка?

1 Ответ

0 голосов
/ 01 ноября 2019

Итак, я нашел решение с помощью специального адаптера запросов:

$table->createAdapter(ORMAdapter::class, [
            'entity' => User::class,
            'query' => function (QueryBuilder $builder) {
                $builder
                        ->select('user')
                        ->from(User::class, 'user')
                        ->leftJoin('user.personalData', 'personalData')
                        ->leftJoin('personalData.gender', 'gender')
                ;
            },
        ]);

С помощью этого адаптера я мог бы получить столбцы с полами следующим образом:

->add('gender', TextColumn::class, ['label' => 'Gender', 'orderable'=> true, 'field' => 'gender.abbreviation'])

Возможно, это просто невозможнос поведением по умолчанию omines datatables?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...