我试图弄清楚如何在symfony 3.4应用程序中检索(通过存储库方法,例如使用DQL请求)实体,具体取决于“json”类型列中特定键的值。看到有一些东西可能与postgre但我没有找到任何与mariaDB
假设我得到一个实体 Letter
使用此属性:
/**
*
* @ORM\Column(type="json")
*/
private $metadatas;
其中包含,例如:
{
"key1": "value",
"key2": "value"
}
我怎样才能,或者,是否可以请求我的数据库为metadatas列中的特定键获取具有特定值的字母。
类似的东西:
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+,doctrine / dbal ^ 2.6,doctrine orm ^ 2.5
非常感谢。
答案 0 :(得分:7)
您可以使用ScientaNL/DoctrineJsonFunctions
通过添加:
通过composer安装它"scienta/doctrine-json-functions": "~4.0",
注册doctrine配置中需要的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编码格式中,在本例中使用双引号。
参考文献: