我试图在symfony 3.4应用程序中,根据"json“类型列中特定键的值来检索实体(例如,通过存储库方法检索DQL请求)。看到了波斯特格里有一些可能的东西,但我没有找到任何关于mariaDB的东西
假设我收到一个实体字母
拥有这一财产:
/**
*
* @ORM\Column(type="json")
*/
private $metadatas;其中包括,例如:
{
"key1": "value",
"key2": "value"
}我怎样才能,或者,是否可以请求我的DB获得元数据列中特定键的特定值的字母。
就像这样:
public function getByKeyValue($key, $value)
{
$em = $this->_em;
$dql = "SELECT l FROM AppBundle:Letter l
WHERE l.metadatas->:key = :value
";
$query = $em->createQuery($dql);
$query->setParameter('key', $key);
$query->setParameter('value', $value);
return $query->getResult();
} 一些信息:
php7.1,mariadb 10.2+,原则/dbal ^2.6,原则orm ^2.5
非常感谢。
发布于 2018-03-20 22:53:40
您可以使用ScientaNL/DoctrineJsonFunctions
通过composer安装它,添加:
"scienta/doctrine-json-functions": "~4.0",注册理论配置中所需的json函数,在本例中为JSON_CONTAINS。
doctrine:
orm:
entity_managers:
some_em: # usually also "default"
dql:
string_functions:
JSON_CONTAINS: Scienta\DoctrineJsonFunctions\Query\AST\Functions\Mysql\JsonContains就我而言,我只是补充说:
doctrine:
orm:
dql:
string_functions:
JSON_CONTAINS: Scienta\DoctrineJsonFunctions\Query\AST\Functions\Mysql\JsonContains使用它:
$queryBuilder = $this->getDoctrine()->getRepository('AppBundle:Letter')->createQueryBuilder('lt');
$queryBuilder
->where("JSON_CONTAINS(lt.metadatas, :mvalue, '$.key') = 1");
$queryBuilder->setParameter('mvalue', '"value"');
$query = $queryBuilder->getQuery();
return $query->getResult();在dql中,应该是这样的:
$dql = "SELECT l FROM AppBundle:Letter l
WHERE JSON_CONTAINS(lt.metadatas, :mvalue, '$.key') = 1
";注$.key是用于筛选的json键,mvalue应该包含在其json编码格式中,在本例中使用双引号。
参考文献:
https://stackoverflow.com/questions/49279909
复制相似问题