简体   繁体   中英

Using Array Entity in Doctrine Query Builder


How are you?
I created an array entity.
 /** * @Groups({"event_rating_question", "portal"}) * * @ORM\Column(type="json", nullable=true) */ private?array $eventTypeIds = [];

In the repository, I want to get the results if the request parameter is in that array entity.
So I created the repository function like:

 public function findQuestionsByEventType(int $eventTypeId) { $queryBuilder = $this->createQueryBuilder('item') ->andWhere(':eventTypeId MEMBER OF item.eventTypeIds') ->setParameter('eventTypeId', $eventTypeId) ->orderBy('item.sortOrder', 'ASC'); return $queryBuilder->getQuery()->getResult(); }

But I have an error like below:
"Exception: [Semantical Error] line 0, col 88 near 'eventTypeIds': Error: Invalid PathExpression. Must be a CollectionValuedAssociationField. "
If someone knows how to fix it, please let me know.
Thanks.

You cannot use a json field as an array in your DQL query. To do this, create a custom function and register it in your symfony app or use a ready-made extension DoctrineJsonFunctions. You need the function JSON_CONTAINS to check if the value is in your json array.

And so, if you decide to use DoctrineJsonFunctions , then here is an example of use:

Installation

composer require scienta/doctrine-json-functions

Declare a function in config/packages/doctrine.yaml

orm:
    dql:
        string_functions: 
            JSON_CONTAINS: Scienta\DoctrineJsonFunctions\Query\AST\Functions\Mysql\JsonContains

Now you can use the function in your repository

public function findQuestionsByEventType(string $eventTypeId)
{
    $queryBuilder = $this->createQueryBuilder('item')
        ->where("JSON_CONTAINS(item.eventTypeIds, :eventTypeId) = true")
        ->setParameter('eventTypeId', $eventTypeId)
        ->orderBy('item.sortOrder', 'ASC');

    return $queryBuilder->getQuery()->getResult();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM