简体   繁体   English

MYSQL - 如何在 JSON 数组中搜索?

[英]MYSQL - How to search in JSON array?

On my Symfony 5 app, i've a database with a candidate table that contains a json field.在我的 Symfony 5 应用程序上,我有一个包含 json 字段的候选表的数据库。

candidate 1 : [{"end": "30/04/2020", "start": "01/03/2020"},{"end": "31/07/2020", "start": "01/07/2020"}]候选 1 : [{"end": "30/04/2020", "start": "01/03/2020"},{"end": "31/07/2020", "start": "01/ 07/2020"}]

candidate 2 : [{"end": "31/03/2020", "start": "01/03/2020"},{"end": "31/07/2020", "start": "01/07/2020"}]候选 2 : [{"end": "31/03/2020", "start": "01/03/2020"},{"end": "31/07/2020", "start": "01/ 07/2020"}]

Is it possible with query builder to find a candidate where this field corresponds to the arguments ?查询生成器是否可以找到该字段对应于参数的候选对象?

ex: I would like to find all the candidates who are available between 10/03/2020 and 10/04/2020.例如:我想找到在 10/03/2020 和 10/04/2020 之间有空的所有候选人。 This case should just return the candidate 1.这种情况应该只返回候选人 1。

I guess it's not possible to do this with query builder so i'm trying to use native SQL but... what's the sql syntax ?我想使用查询构建器不可能做到这一点,所以我正在尝试使用本机 SQL 但是......什么是 sql 语法?

I tried with availability_dates`->"$.start" = "01/03/2020" but it does not work because it's a "collection".我尝试了availability_dates`->"$.start" = "01/03/2020"但它不起作用,因为它是一个“集合”。

This is a poorly-conceived database structure.这是一个构思拙劣的数据库结构。 Clearly, the JSON string represents a "repeating group" of related data, which violates the principles of so-called "normal forms."显然,JSON 字符串代表了相关数据的“重复组”,这违反了所谓的“范式”原则。

https://en.wikipedia.org/wiki/Database_normalization https://en.wikipedia.org/wiki/Database_normalization

You should be storing the start/end dates in a separate table, say, candidate_dates , with columns like candidate_id, start, end.您应该将开始/结束日期存储在一个单独的表中,例如, candidate_dates ,包含诸如candidate_id, start, end.类的列candidate_id, start, end. This has a so-called "one-to-many relationship" to the parent table, candidates .这与父表candidates之间存在所谓的“一对多关系”

Now, you can write a simple query which JOINs the two tables to get the answers you need.现在,你可以写一个简单的查询其JOINs两个表来获得您需要的答案。

Entity like that ?Entity like that ?那样的实体?那样的实体? One candidate can have one or more available dates and one available dates can only be linked to one candidate.一名候选人可以有一个或多个可用日期,一个可用日期只能与一名候选人相关联。

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Table(name="candidate_available_dates", uniqueConstraints={
 *    @ORM\UniqueConstraint(name="unique_candidate_available_dates", columns={"candidate_id", "start", "end"})
 * })
 *
 * @ORM\Entity(repositoryClass="App\Repository\CandidateAvailableDatesRepository")
 */
class CandidateAvailableDates
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Candidate", inversedBy="candidateAvailableDates")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="candidate_id", referencedColumnName="candidate_id", nullable=false)
     * })
     */
    private $candidate;

    /**
     * @ORM\Column(type="date")
     * @Assert\NotBlank
     */
    private $start;

    /**
     * @ORM\Column(type="date")
     * @Assert\NotBlank
     */
    private $end;

[...]
// GETTER and SETTER

And in Candidate entity, the reversed side而在 Candidate 实体中,反面

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\CandidateAvailableDates", mappedBy="candidate")
     */
    private $candidateAvailableDates;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM