Я пытаюсь сохранить некоторые данные с различными структурами в моей базе данных. Способ, которым я пытаюсь это сделать, - создать запись записи и прикрепить записи (атрибуты) к этой записи для ее условий/значений.Хранение сложных данных
Record 1
-> Entity 1 = title:Fruit, dataString:Apple
-> Entity 2 = title:quantity, dataNumber:5
-> Entity 3 = title:color, dataString:red
etc...
Record 2
-> Entity 1 = title:Fruit, dataString:Apple
-> Entity 2 = title:quantity, dataNumber:5
-> Entity 3 = title:color, dataString:green
etc...
Я хочу, чтобы иметь возможность возвращать все цветовые результаты, где Fruit == Apple quantity == 5. поэтому [красный, зеленый]
Я не могу создать таблицу для каждого типа записи, потому что мои данные очень сложны и имеют различные атрибуты (запись), связанные с каждой записью
<?php
namespace App\ReferenceBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Entry
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="App\ReferenceBundle\Entity\EntryRepository")
*/
class Entry
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
/**
* @var string
*
* @ORM\Column(name="data_string", type="string", length=255, nullable=true)
*/
private $dataString;
/**
* @var float
*
* @ORM\Column(name="data_number", type="float", nullable=true)
*/
private $dataNumber;
/**
* @var App\ReferenceBundle\Entity\Record[]
*
* @ORM\ManyToMany(targetEntity="App\ReferenceBundle\Entity\Record", mappedBy="entries")
*/
private $records;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set title
*
* @param string $title
* @return Record
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* Get title
*
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* Set dataString
*
* @param string $dataString
* @return Record
*/
public function setDataString($dataString)
{
$this->dataString = $dataString;
return $this;
}
/**
* Get dataString
*
* @return string
*/
public function getDataString()
{
return $this->dataString;
}
/**
* Set dataNumber
*
* @param float $dataNumber
* @return Record
*/
public function setDataNumber($dataNumber)
{
$this->dataNumber = $dataNumber;
return $this;
}
/**
* Get dataNumber
*
* @return float
*/
public function getDataNumber()
{
return $this->dataNumber;
}
/**
* Constructor
*/
public function __construct()
{
$this->records = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add records
*
* @param \App\ReferenceBundle\Entity\Record $records
* @return Entry
*/
public function addRecord(\App\ReferenceBundle\Entity\Record $records)
{
$this->records[] = $records;
return $this;
}
/**
* Remove records
*
* @param \App\ReferenceBundle\Entity\Record $records
*/
public function removeRecord(\App\ReferenceBundle\Entity\Record $records)
{
$this->records->removeElement($records);
}
/**
* Get records
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getRecords()
{
return $this->records;
}
}
<?php
namespace App\ReferenceBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Record
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="App\ReferenceBundle\Entity\RecordRepository")
*/
class Record
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var App\ReferenceBundle\Entity\Entry[]
*
* @ORM\ManyToMany(targetEntity="App\ReferenceBundle\Entity\Entry", inversedBy="records")
* @ORM\JoinTable(name="link_records_entries",
* joinColumns={@ORM\JoinColumn(name="record_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="entry_id", referencedColumnName="id")}
* )
*/
private $entries;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Constructor
*/
public function __construct()
{
$this->entries = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add entries
*
* @param \App\ReferenceBundle\Entity\Entry $entries
* @return Record
*/
public function addEntry(\App\ReferenceBundle\Entity\Entry $entries)
{
$this->entries[] = $entries;
return $this;
}
/**
* Remove entries
*
* @param \App\ReferenceBundle\Entity\Entry $entries
*/
public function removeEntry(\App\ReferenceBundle\Entity\Entry $entries)
{
$this->entries->removeElement($entries);
}
/**
* Get entries
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getEntries()
{
return $this->entries;
}
}
public function options($matches, $output)
{
$qb = $this->createQueryBuilder('entry');
$qb->innerJoin('entry.records', 'record');
$qb->innerJoin('record.entries', 'entries');
$qb->where('entry.title = :output');
$params = ["output" => $output];
foreach ($matches as $title => $value) {
$title1 = str_replace(" ", "_", $title);
$qb->andWhere('entries.title = :'.$title1.' AND (entries.dataString = :'.$title.'dataString OR entries.dataNumber = :'.$title.'dataNumber)');
$params[$title1] = $title;
$params[$title."dataString"] = $value;
$params[$title."dataNumber"] = $value;
}
$qb->setParameters($params);
$array = $qb
->select('entry.dataString, entry.dataNumber')
->distinct()
->getQuery()
->getResult();
var_dump($array);exit();
В приведенном выше коде $ выход будет цветным, а $ matches будет содержать количество и фрукты.
Очевидно, что вышеуказанный код не работает, потому что он пытается найти одну запись, содержащую тип и фрукты, что невозможно. Мне нужно вернуть записи, в которых есть записи для сестер, которые соответствуют массиву совпадений.
Возможно, я не ошибаюсь. Любые рекомендации будут оценены.