Symfony/已找到的条令

Symfony/已找到的条令,symfony,doctrine,Symfony,Doctrine,Hove创建自定义存储库函数,通过json字段进行查询。我的数据库中的params列如下所示: “参数”:{ “产品”:“塞子”, “项目标识符”:” } 我想按产品值查询记录。在这种情况下,您可以通过一个经典示例来实现这一点: 在您的存储库中: 一个结果是 公共函数findOneProduct($value):?参数 { 返回$this->createQueryBuilder('p') ->andWhere('p.product=:val') ->setParameter('val',$va

Hove创建自定义存储库函数,通过json字段进行查询。我的数据库中的params列如下所示:

“参数”:{
“产品”:“塞子”,
“项目标识符”:”
}

我想按产品值查询记录。在这种情况下,您可以通过一个经典示例来实现这一点:

在您的存储库中: 一个结果是

公共函数findOneProduct($value):?参数
{
返回$this->createQueryBuilder('p')
->andWhere('p.product=:val')
->setParameter('val',$value)
->getQuery()
->getOneOrNullResult()
;
}
多重结果

公共函数findParamsByProduct($value):?参数
{
返回$this->createQueryBuilder('p')
->andWhere('p.product=:val')
->setParameter('val',$value)
->orderBy(/*某些字段*/)
->setMaxResults(/*如果需要*/)
->getQuery()
->getResults()
;
}
在控制器中:

$stoppers=$entityManager->getRepository(Params::class)->findParamsByProduct('stopper');

如果我正确理解了您的问题,您的表中有一列名为params。在这个mysql列中,存储JSON文本

然后,您希望查询该表并通过查看列中的JSON进行筛选

这可能有点单调乏味,在过去(Mysql 5.7.8中的JSON类型之前)也非常不鼓励这样做。 最佳实践是使用NoSQL数据库,如MongoDB,它是存储在集合(表)中的实际JSON

不管怎样,你有一个解决办法

考虑到@AppyGG,解释了如何创建自定义存储库功能

首先,我们必须使用纯SQL进行查询。 这可以通过两种方式实现:

1.返回包含数据的数组

$conn = $this->getEntityManager()->getConnection();

$sql = '
    SELECT * FROM product p
    WHERE p.price > :price
    ORDER BY p.price ASC
    ';
$stmt = $conn->prepare($sql);
$stmt->execute(['price' => $price]);

// returns an array of arrays (i.e. a raw data set)
return $stmt->fetchAll();
2.返回含水实体

use Doctrine\ORM\Query\ResultSetMappingBuilder;

$rsm = new ResultSetMappingBuilder($entityManager);
$rsm->addRootEntityFromClassMetadata('MyProject\Product', 'p');

$sql = '
    SELECT * FROM product p
    WHERE p.price > :price
    ORDER BY p.price ASC
    ';
 $nql = $this->_em->createNativeQuery( $sql, $rsm );
 $nql->setParameter('price', $price);

//Return loaded entities
return $nql->getResult();
现在,知道了如何使用条令进行MySQL查询,我们希望选择在JSON数据中过滤的结果

我指的是这个美丽的stackoverflow,它解释了这一切:

其中提出的最简单的解决方案至少需要MySQL 5.7.8

您的MySQL查询如下所示:

//With $entity->getParams() == '{"params": {"product":"stopper", "itemIdentifier":""}}'
$conn = $this->getEntityManager()->getConnection();

$sql = '
    SELECT * FROM Entity e
    WHERE JSON_EXTRACT(e.params, "$.params.product") = :product
    ';
//Or Like this if the column is of Type JSON in MySQL(Not doctrine, yes check MySQL).
$sql = '
    SELECT * FROM Entity e
    WHERE e.params->"$.params.product" = :product
    ';
$stmt = $conn->prepare($sql);
$statement->bindValue("product","stopper");
$stmt->execute();
return $statement->fetchAll();
希望这有帮助

注意,我的示例使用了一个名为“params”的列,其中一个Json还包含一个命名属性“params”,这可能会让人混淆。目的是展示如何进行多级过滤