2012-06-02 4 views
2

Я хочу хранить динамические атрибуты в базе данных.Doctrine: Как хранить динамические атрибуты

Пример: Некоторые пользователи хотят создать профиль с пользовательскими характеристиками. Это может быть возраст, хобби, работа, школа или что еще. Каждый пользователь может установить свой собственный характер. На стороне сервера это может выглядеть следующим образом:

$characteristics = array(
     0 => array('age', 22), 
     1 => array('hobby', 'php'), 
     2 => array('food', 'pizza'), 
    ); 

С этой структурой, то можно считывать сам атрибут и значение также можно легко добавлять и удалять атрибуты.

Теперь я хочу хранить такие данные по доктрине.

Теперь вопрос, как я могу сделать это лучше всего:

  1. Упорство в массив
  2. JSON
  3. XML
  4. Другое?

ответ

8

Если вы хотите, чтобы это было просто, лучшим способом, вероятно, было бы просто использовать массив.

Doctrine 2 имеет поддержку типа «массив»: если вы сопоставляете свойство с этим типом, оно будет автоматически сериализоваться и десериализоваться в базу данных.

Например, вы могли бы сделать что-то вроде этого:

class MyEntity { 
    /** @Column(type="array") */ 
    private $attributes = array(); 

    public function setAttribute($name, $value) { 
     $this->attributes[$name] = $value; 
    } 

    public function getAttribute($name) { 
     return $this->attributes[$name]; 
    } 
} 

подход, как это позволит вам легко хранить атрибуты, и это было бы также абстрагировать детали того, как она хранится, так что если вы хотел изменить его в будущем (например, возможно, использовать таблицу EAV или такой), вам не нужно было бы менять другой код.

+0

Привет, я также планировал бы сделать массивы многоразовыми. Например, для некоторых метаданных это неплохо. Представьте, что вы хотите добавить некоторую подробную информацию к своим изображениям (местоположение, камера и т. Д.), Чем было бы хорошо, если бы эта структура была повторно использована. С массивами я просто могу удалить второе значение и сохранить структуру необработанного массива. Единственным препятствием является то, что весь процесс должен быть жестко закодирован. Но я не думаю, что есть лучшие способы ... – bodokaiser

+0

Интересно, как поиск будет работать с этим? – mr1031011

+0

@ mr1031011 это будет не очень хорошо, с пользовательскими атрибутами может быть лучше использовать отдельную поисковую систему (например, ElasticSearch), поскольку они могут хорошо обрабатывать документы с произвольными полями. –

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