2014-12-20 2 views
0

Я пытаюсь сохранить некоторые данные с различными структурами в моей базе данных. Способ, которым я пытаюсь это сделать, - создать запись записи и прикрепить записи (атрибуты) к этой записи для ее условий/значений.Хранение сложных данных

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 будет содержать количество и фрукты.

Очевидно, что вышеуказанный код не работает, потому что он пытается найти одну запись, содержащую тип и фрукты, что невозможно. Мне нужно вернуть записи, в которых есть записи для сестер, которые соответствуют массиву совпадений.

Возможно, я не ошибаюсь. Любые рекомендации будут оценены.

ответ

0

Ok Ниже, кажется, сделать трюк

public function options($matches, $output) 
{ 
    $qb = $this->createQueryBuilder('record'); 



    $qb->innerJoin('record.entries', 'entry'); 

    $qb->where('entry.title = :output'); 
    $params = ["output" => $output]; 



    foreach ($matches as $title => $value) { 

     $title1 = str_replace(" ", "_", $title)."match"; 

     $qb->innerJoin('record.entries', $title1.'entries'); 

     $qb->andWhere($title1.'entries.title = :'.$title1 .' AND ('.$title1.'entries.dataString = :'.$title1.'dataString OR '.$title1.'entries.dataNumber = :'.$title1.'dataNumber)'); 

     $params[$title1] = $title; 
     $params[$title1."dataString"] = $value; 
     $params[$title1."dataNumber"] = $value; 
    } 


    $qb->setParameters($params); 

    $array = $qb 
     //->select('entry1.title, entry1.dataString, entry1.dataNumber, entry.title as title1') 
     ->select('entry.dataString, entry.dataNumber') 
     ->distinct() 
     ->getQuery() 
     ->getResult(); 


    $arrayFlat = iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array)),false); 

    $arrayNotNulls = array_filter($arrayFlat, 'strlen'); 
    $arrayKeysFixed = array_values($arrayNotNulls); 

    return $arrayKeysFixed; 
} 
1

Вам необходимо использовать структуру EAV (Entity, Attribute, Value) - эта структура используется в Magento и Drupal. Удачи! :)

Смежные вопросы