Symfony 4: проблема с поисковыми фильтрами для данных - PullRequest
0 голосов
/ 28 июня 2019

Я хочу создать систему управления билетами с Symfony 4, поэтому я использую Mapsred / TicketingBundle комплект.

Этот пакет использует для просмотра и поиска билетов таблицу из datatables.net. Я застрял с доктриной в фильтрах поиска билетов.

Я хочу, чтобы в этой таблице можно было найти имя клиента авторов билета

UserEntity:

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(name="app_user")
 */
class User implements UserInterface
{
    /**
     * @ORM\Column(type="string", length=180, unique=true)
     * @AssertPerso\Email
     */
    private $email;

    /**
     * @var string
     *
     * @ORM\Column(name="username", type="string", length=255, nullable=false)
     */
    private $username;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Formation")
     * @ORM\JoinColumn(nullable=false)
     */
    private $formation;

FormationEntity:

/**
 * @ORM\Entity(repositoryClass="App\Repository\FormationRepository")
 */
class Formation
{
    /**
     * @ORM\Column(type="array", nullable=true)
     */
    private $formations = [];

    /**
     * @ORM\Column(type="string", length=180, unique=true)
     */
    private $customerName;

Я хочу иметь возможность выполнять в таблицах поиска столбец "customerName"

Я застрял в файле пакета TicketRepository.

TicketRepository:

/** @var array $joins */
private $joins;

/**
 * @param string|null $globalSearch
 * @param array $columns
 * @param array $fields
 * @param array $sortOrder
 * @param int $offset
 * @param int $limit
 * @param bool $isCount
 * @param string $status
 * @param string $type
 * @param UserInterface|null $user
 * @return array|int
 * @throws \Doctrine\ORM\NonUniqueResultException
 */
public function searchDataTable(string $globalSearch = null, array $columns, array $fields, array $sortOrder, int $offset,
                                int $limit, bool $isCount, $status, $type, UserInterface $user = null)
{
    $this->joins = ['q.status' => 'status'];
    $parameters = ['_status' => $status];
    $qb = $this->createQueryBuilder('q')
        ->where('status.name = :_status');

    $sort = key($sortOrder);
    $order = $sortOrder[$sort];
    $qb->orderBy($this->getX($sort), $order);

    if ($type === 'perso') {
        $qb->andWhere('q.author = :_author');

        $parameters['_author'] = $user;

    }

    if ($type === 'list_public') {
        $qb->andWhere($qb->expr()->orX('q.author = :_author', 'q.public = :_public'));

        $parameters['_author'] = $user;
        $parameters['_public'] = true;
    }

    if (null !== $globalSearch) {
        $qbWhere = [];
        $parameters['globalSearch'] = '%' . $globalSearch . '%';

        foreach ($fields as $field) {
            $qbWhere[] = $qb->expr()->like($this->getX($field), ':globalSearch');
        }

        $qb->andWhere(call_user_func_array([$qb->expr(), 'orX'], $qbWhere));
    } elseif (!empty($columns)) {
        $qbWhere = [];
        foreach ($columns as $field => $value) {
            $qbWhere[] = $qb->expr()->like($this->getX($field), ':' . $field);
            $parameters[$field] = '%' . $value . '%';
        }

        $qb->andWhere(call_user_func_array([$qb->expr(), 'andX'], $qbWhere));
    }

    foreach ($this->joins as $join => $alias) {
        $qb->leftJoin($join, $alias);
    }

    $qb->setParameters($parameters);

    if ($isCount) {
        return $qb->select('COUNT(q.id)')->getQuery()->getSingleScalarResult();
    }

    dump($qb);
    return $qb->setFirstResult($offset)->setMaxResults($limit)->getQuery()->getResult();
}

/**
 * @param string $field
 * @return string
 */
private function getX(string $field)
{
    if ($field === 'author') {
        $this->joins['q.author'] = 'author';

        return 'author.username';
    } elseif ($field === 'customername') {
        $this->joins['q.author'] = 'author';

        return 'author.formation';
    } elseif ($field === 'category') {
        $this->joins['q.category'] = 'category';

        return 'category.name';
    } elseif ($field === 'status') {
        $this->joins['q.status'] = 'status';

        return 'status.value';
    } elseif ($field === 'priority') {
        $this->joins['q.priority'] = 'priority';

        return 'priority.value';
    } elseif ($field === 'assignated') {
        $this->joins['q.assignated'] = 'assignated';

        return 'assignated.username';
    }

    return 'q.' . Inflector::camelize($field);
}

Когда я ищу в поле CustomerName, я получаю:

[Semantical Error] line 0, col 126 near 'formation LIKE': Error: Invalid PathExpression. Must be a StateFieldPathExpression.

Может ли кто-нибудь помочь мне? Я не очень разбираюсь в Доктрине, она довольно новая для меня

1 Ответ

0 голосов
/ 01 июля 2019

Похоже, что запрос некорректен, при полной трассировке стека вы должны найти полный запрос, и при следующей попытке выполнить проверку в базе данных, проверьте правильность в IDE, способной к проверке SQL

чтобы увидеть запрос, прикрепите точку останова в:

\Doctrine\DBAL\Connection::executeQuery

Ваш запрос должен быть в $query переменной

...