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