创建按json字段查询的自定义Repository函数。我的数据库中有params列,如下所示:
"params": {
"product": "stopper",
"itemIdentifier": ""
}我想按产品价值查询记录。在这种情况下,停止项。
发布于 2020-01-28 22:41:08
您可以通过一个经典示例来实现这一点:
在您的存储库中:只有一个结果
public function findOneProduct($value): ?Params
{
return $this->createQueryBuilder('p')
->andWhere('p.product = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}对于多个结果
public function findParamsByProduct($value): ?Params
{
return $this->createQueryBuilder('p')
->andWhere('p.product = :val')
->setParameter('val', $value)
->orderBy(/*some field */)
->setMaxResults(/*if needed*/)
->getQuery()
->getResults()
;
}在您的控制器中:
$stoppers = $entityManager->getRepository(Params::class)->findParamsByProduct('stopper');发布于 2020-01-29 08:45:25
如果我没理解错的话,您有一个表,其中有一个名为params的列。在这个mysql列中,存储JSON文本。
然后,您希望通过查看列中的JSON来查询该表并进行过滤。
这可能有点单调乏味,而且在过去(在Mysql 5.7.8中的JSON Type之前)也是非常不被鼓励的。最佳实践是将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();现在,了解了如何使用query进行MySQL查询,我们希望选择在JSON数据中过滤的结果。
我引用了这个漂亮的stackoverflow,它解释了一切:How to search JSON data in MySQL?
其中提出的最简单的解决方案至少需要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‘的列和一个还包含命名属性'params’的Json,这可能会让人感到困惑。本文的目的是展示如何进行多级过滤。
https://stackoverflow.com/questions/59951044
复制相似问题