За последние 24 часа нас посетили 154863 программиста и 2139 роботов. Сейчас ищут 1230 программистов ...

EAV

Тема в разделе "PHP и базы данных", создана пользователем Koc, 7 авг 2009.

  1. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Быть может, кто-то заделится своей реализацией?
     
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    У 440hz в легкошопе, вроде как, eav модель.
     
  3. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Он писал, что там объекты хранятся, сейчас гляну. У меня как бы есть уже что-то, но все оно через ж0пу сделано, мне не нравится. Думаю, что можно лучше сделать.
     
  4. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Вообще eav не лучшая модель. Тебе для чего надо, для инет магазина?
     
  5. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    да (вот там как раз это уже есть).

    А еще сейчас работаю над механизмом учетных записей, так там хочу реализовать возможность "навешивания" пользователям N-ого числа полей. Ну типа для покупателей это будет ФИО, телефон, адрес доставки по умолчанию, для студента это будет вуз, факультет на котором он обучается и тд. (вот здесь я хочу это сделать правильно)
     
  6. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Фильтрация и сортировка по этим параметрам нужна будет?
     
  7. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    а, вспомнил. Еще думаю о модуле "анкетирование". Типа когда создаешь список вопросов, отвечать на которые нужно по-разному: текст, текстовое поле, да/нет, выбор 1 из многого, нескольких из многого и тд.
     
  8. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    В анкетировании - не нужна.
    В магазине - да.
     
  9. kostyl

    kostyl Guest

    а че за EAV?
    (ps: вот нет, чтобы расшифровать для не знающих.....)
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  11. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    я не прошу полностью рабочий код, подходят решения на псевдокоде, описание структур таблиц, прочие советы.
     
  12. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ээх, ребята-ребята (с)
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    самому не придумать? ну хоть начни с чего-нить...
    а там разберемся...
     
  14. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    оке. Завтра протрезвею, напишу 2 своих варианта решения
     
  15. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Бугагага, алкота одна, все бухают. :)
     
  16. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    да уж. Пора завязывать с этим. Отпуск глупо проходит.

    так вот, сейчас в товарах имеем следующее:

    таблица атрибуты
    id, type_id, title, сравниваемый, видимый, обязательный, text_id - нужно для "мануального" вывода на страницу

    attr_text
    id, value_default, check - тип проверки, которую нужно выполнить

    attr_textarea
    id, value_default

    attr_boolean
    id, value_default

    attr_select
    id, is_multiple - типа один выбираем или несколько

    attr_select_options
    attr_id, option_id, value, is_selected

    теперь нужно ж как-то сохранять заполненные атрибуты

    attr_text_values
    attr_id, product_id, value

    attr_textarea_values
    attr_id, product_id, value

    attr_bool_values
    attr_id, product_id, value

    attr_select_values
    attr_id, product_id, value - хранятся через запятую выбранные параметры из таблицы _options


    жирным показаны связи. Вот такое говнецо получается. А еще есть желание реализовать мультиязычность.

    В "пользователях" чуток попроще. Ибо времени совсем мало на разработку, нужно уже внедрять это все

    users_fields
    id, type_id, title - по этому title мы бум обращаться к полю, так что он типа заменитель идента, должен быть уникален

    users_fields_values
    field_id, user_id, v_text, v_textarea, v_boolean

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

    Вставка еденичной записи выглядит так:
    PHP:
    1. <?php
    2. class Users
    3. {
    4. // ...
    5.     private function setValue($userId, $field, $value)
    6.     {
    7.         //TODO: сделать отложенную запись
    8.         //TODO: написать метод, в котором будут устанавливаться множество правил
    9.         $this->db->multiQuery('
    10.             SET @TITLE = ?s;
    11.             SET @VALUE = ?s;
    12.            
    13.             SET @FIELD_ID = (SELECT id FROM ?t WHERE title=@TITLE);
    14.             SET @FIELD_TYPE = (SELECT type FROM ?t WHERE title=@TITLE);
    15.            
    16.             SET @VAL_TEXT = if(@FIELD_TYPE = 1, @VALUE, "");
    17.             SET @VAL_TEXTAREA = if(@FIELD_TYPE = 2, @VALUE, "");
    18.             SET @VAL_BOOLEAN = if(@FIELD_TYPE = 3, @VALUE, "");
    19.            
    20.             REPLACE INTO ?t SET
    21.                 user_id=?i,
    22.                 field_id=@FIELD_ID,
    23.                 `text`=@VAL_TEXT,
    24.                 textarea=@VAL_TEXTAREA,
    25.                 `bool`=@VAL_BOOLEAN',
    26.             $field, $value, self::USERS_FIELDS, self::USERS_FIELDS,
    27.             self::USERS_FIELDS_VALUES, $userId);
    28.     }
    29. // ...
    30. }
     
  17. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    я вечером распишу модель, что юзал в нескольких проектах, если еще актуально.
     
  18. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ок, заранее спасибо
     
  19. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    неужели обещанного три года ждут?
     
  20. kostyl

    kostyl Guest

    Koc
    Точнее 2 ^ 10 дней
     
  21. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Завтра вечером уезжаю на Z17
     
  22. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    итак, я приехал с Z17 [​IMG]
    что там с EAV?
     
  23. kostyl

    kostyl Guest

    да глянь как в легкошопе, у него сейчас чат на Jquery кипит....
     
  24. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    так блин, ну он же ж сам обещал расписать модель.
     
  25. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    как обещано.

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

    класс -> экземпляры класса.

    для решения такой задачи мне потребовалось уметь работать с моделью(классами) и самими объектами, сгенеренными по нужному классу.

    1. работа с моделью.

    для работы с моделью нам потребуется:
    - уметь хранить и работать с древовидной стуктурой.
    - каждому узлу дерева сопоставлять определенный набор свойств.
    - уметь работать со свойстывами и их значениями.

    итак. с деревьями все просто. я не стал ничего мудрить и сделал классическую структуру:

    отец->сын

    tree_id - идентификатор узла
    tree_fid - предок
    tree_name - имя узла

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

    t2p_tree_id
    t2p_prop_id

    и сама таблица свойств

    prop_id
    prop_name
    prop_type

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

    p2v_prop_id
    p2v_val_id

    и саму таблицу свойств.

    val_id
    val_pos - порядковый номер свойства
    val_name

    val_pos(0) - дефолтное значение. пркатически не использоватлось.

    теперь я умел работать с деревом и привязывать к любому узлу дерева свойства и их значения. так же при работе с деревом я получил наследование свойст узлов более высого уровня. например сделав свойство ИМЯ я получал это свойство во всех узлах объектной модели.

    как пример:

    --------------------------------
    Код (Text):
    1.  
    2. root
    3.     (name)
    4.     son1
    5.         (val1)
    6.     son2
    7.         (val2)
    --------------------------------

    class root {
    var $name;
    }

    class son1 extends root {
    var $p1;
    }

    class son2 extends root {
    var $p2;
    }

    --------------------------------

    класс son(1,2) наследовал $name и все было хорошо. причем узлы могли иметь свои собственные свойства.

    повторюсь, это как пример для понимания!!!

    теперь собственно о самих объектах. имея динамическую модель хранения свойств объектов я мог приступить к работе с самими объектами.

    obj_id
    obj_tree_id

    промежуточная таблица связей один-много

    o2p_obj_id
    o2p_prop_id

    и их свойствами

    prop_id
    prop_val

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