首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony / Doctrine findBy

Symfony / Doctrine findBy
EN

Stack Overflow用户
提问于 2020-01-28 22:34:06
回答 2查看 1.7K关注 0票数 0

创建按json字段查询的自定义Repository函数。我的数据库中有params列,如下所示:

代码语言:javascript
复制
"params": {
    "product": "stopper",
    "itemIdentifier": ""
}

我想按产品价值查询记录。在这种情况下,停止项。

EN

回答 2

Stack Overflow用户

发布于 2020-01-28 22:41:08

您可以通过一个经典示例来实现这一点:

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

代码语言:javascript
复制
public function findOneProduct($value): ?Params
{
    return $this->createQueryBuilder('p')
        ->andWhere('p.product = :val')
        ->setParameter('val', $value)
        ->getQuery()
        ->getOneOrNullResult()
    ;
}

对于多个结果

代码语言:javascript
复制
public function findParamsByProduct($value): ?Params
{
    return $this->createQueryBuilder('p')
        ->andWhere('p.product = :val')
        ->setParameter('val', $value)
        ->orderBy(/*some field */)
        ->setMaxResults(/*if needed*/)
        ->getQuery()
        ->getResults()
    ;
}

在您的控制器中:

代码语言:javascript
复制
$stoppers = $entityManager->getRepository(Params::class)->findParamsByProduct('stopper');
票数 0
EN

Stack Overflow用户

发布于 2020-01-29 08:45:25

如果我没理解错的话,您有一个表,其中有一个名为params的列。在这个mysql列中,存储JSON文本。

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

这可能有点单调乏味,而且在过去(在Mysql 5.7.8中的JSON Type之前)也是非常不被鼓励的。最佳实践是将MongoDB之类的JSON存储在一个集合(表)中。

无论如何,这里有一个解决方案。

考虑到@AppyGG解释了如何创建自定义存储库函数。

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

1.返回包含数据的数组。

代码语言:javascript
复制
$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.返回水合实体

代码语言:javascript
复制
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查询如下所示:

代码语言:javascript
复制
//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,这可能会让人感到困惑。本文的目的是展示如何进行多级过滤。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59951044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档