arn*_*bey 2 json doctrine dql mariadb symfony
我试图弄清楚如何在symfony 3.4应用程序中检索(通过存储库方法,例如使用DQL请求)实体,具体取决于"json"类型列中特定键的值.看到postgre有一些东西,但我没有找到任何与mariaDB相关的东西
假设我收到一封实体信
有这个属性:
/**
*
* @ORM\Column(type="json")
*/
private $metadatas;
Run Code Online (Sandbox Code Playgroud)
其中包含,例如:
{
"key1": "value",
"key2": "value"
}
Run Code Online (Sandbox Code Playgroud)
我怎么能,或者,是否可以请求我的数据库获取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();
}
Run Code Online (Sandbox Code Playgroud)
一些信息:
php7.1,mariadb 10.2+,doctrine/dbal ^ 2.6,doctrine orm ^ 2.5
非常感谢.
你可以使用ScientaNL/DoctrineJsonFunctions
通过添加以下内容通过composer安装它:
"scienta/doctrine-json-functions": "~4.0",
Run Code Online (Sandbox Code Playgroud)
注册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
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我刚刚补充说:
doctrine:
orm:
dql:
string_functions:
JSON_CONTAINS: Scienta\DoctrineJsonFunctions\Query\AST\Functions\Mysql\JsonContains
Run Code Online (Sandbox Code Playgroud)
用它:
$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();
Run Code Online (Sandbox Code Playgroud)
在dql中,它应该是这样的:
$dql = "SELECT l FROM AppBundle:Letter l
WHERE JSON_CONTAINS(lt.metadatas, :mvalue, '$.key') = 1
";
Run Code Online (Sandbox Code Playgroud)
注意$ .key是要过滤的json键,mvalue应该包含在其json编码格式中,在本例中使用双引号.
参考文献:
| 归档时间: |
|
| 查看次数: |
4484 次 |
| 最近记录: |