MYSQL - Как искать в массиве JSON? - PullRequest
0 голосов
/ 05 февраля 2020

В моем приложении Symfony 5 у меня есть база данных с таблицей кандидатов, которая содержит поле json.

кандидат 1: [{"end": "30/04/2020" , "начало": "01/03/2020"}, {"конец": "31/07/2020", "начало": "01/07/2020"}]

кандидат 2: [ {"end": "31/03/2020", "start": "01/03/2020"}, {"end": "31/07/2020", "start": "01/07/2020" }]

Можно ли с помощью построителя запросов найти кандидата, где это поле соответствует аргументам?

ex: Я хотел бы найти всех кандидатов, которые доступны между 10 / 03/2020 и 10/04/2020. Этот случай должен просто вернуть кандидата 1.

Я думаю, что это невозможно сделать с помощью построителя запросов, поэтому я пытаюсь использовать нативный SQL, но ... каков синтаксис sql ?

Я пытался с availability_dates`->"$.start" = "01/03/2020", но он не работает, потому что это "коллекция".

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Это плохо продуманная структура базы данных. Очевидно, что строка JSON представляет «повторяющуюся группу» связанных данных, которая нарушает принципы так называемых «нормальных форм».

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

Вы должны хранить даты начала / окончания в отдельной таблице, скажем, candidate_dates, с такими столбцами, как candidate_id, start, end. Это имеет так называемое «отношение один-ко-многим» с родителем таблица, candidates.

Теперь вы можете написать простой запрос, который JOINs две таблицы, чтобы получить ответы, которые вам нужны.

0 голосов
/ 05 февраля 2020

Сущность такая? Сущность такая? У одного кандидата может быть одна или несколько доступных дат, и одна доступная дата может быть связана только с одним кандидатом.

<?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

А в кандидате, обратная сторона

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\CandidateAvailableDates", mappedBy="candidate")
     */
    private $candidateAvailableDates;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...