Как настроить отношения супер- и подтипов в DataMapper ORM CodeIgnitor? - PullRequest
1 голос
/ 09 ноября 2011

Я веду онлайн-журнал о еде, где пользователи могут записывать записи в журнале.Существует четыре типа записей: записи еды, записи упражнений, измерения и выполненные задачи.Записи имеют несколько общих атрибутов (например, id, amount, unit_id и т. Д.), Но они также имеют специфичные для типа атрибуты (например, food_id, упражнение_id и т. Д.).Это идеальный кандидат для отношений супер- и подтипов.

Вот мои таблицы (упрощенно):

CREATE TABLE entries
`id` int
`user_id` int
`created` datetime
`entered` datetime
`amount` float
`unit_id` int
PRIMARY KEY id

CREATE TABLE exercise_entries
`entry_id` int
`exercise_id` int
PRIMARY KEY entry_id

CREATE TABLE food_entries
`entry_id` int
`food_id` int
PRIMARY KEY entry_id

Итак, мой вопрос, как мне настроить супер- и саб.отношения с использованием DataMapper ORM CodeIgniter?Я просматривал разделы Руководства пользователя и Расширенные отношения, но ничего не могу найти.

Если это невозможно с DataMapper, я могу придумать несколько решений:

  1. Свернуть атрибуты подтипа вверх (1 большая таблица, тьфу)
  2. Свернуть атрибуты супертипа вниз (4 отдельные таблицы, тьфу)
  3. Идти ядерно и использоватьDoctrine 2.0 ORM (файлы конфигурации YAML, тьфу!)
  4. Используйте другую платформу, чей собственный ORM поддерживает наследование таблиц (я включил в список Kohana и FuelPHP с CodeIgniter).
  5. Вручную кодируйте супер- и суб-тип отношений (в первую очередь побеждает цель ORM).

Я не в восторге ни от одного из моих вариантов.Варианты 1 и 2 создают свои собственные головные боли (см. в этой статье ).Вариант 3 выглядит как операция с кувалдой.Я открыт для варианта 4, потому что я еще не начал писать какой-либо каркасный код (это был действительно трудный выбор между CI и Kohana).Вариант 5 - это то, где я сейчас нахожусь.

Есть предложения?Спасибо за помощь!

1 Ответ

0 голосов
/ 09 ноября 2011

Я не пробовал это с DataMapper, но вы можете попробовать (обязательно вызовите родительский конструктор и все такое). Я бы предположил, что Exerciseentry унаследует все свойства / методы от Entry - но не уверен, что DataMapper будет обрабатывать это так:

class Entry extends DataMapper {

}

// you may have to explicitly include Entry.php in this file:
class Exerciseentry extends Entry {

}

Если это не сработает, вы можете в основном создать два связанных объекта (не совсем чистый ООП принцип, но выполнит работу):

class Entry extends DataMapper {
    // ... some stuff

    var $has_many = array('exerciseentry', 'foodentry'); 

    // ... some more stuff
}

class Exerciseentry extends DataMapper {
    // ... some stuff

    var $has_one = array('entry');

    // ... some more stuff
}

class Foodentry extends DataMapper {
    // ... some stuff

    var $has_one = array('entry');

    // ... some more stuff
}

// then when you get an entry, you'd do this
$my_exercise_entry = new Exerciseentry(1);
$my_exercise_entry->include_related('entry', array('user_id', 'amount', 'unit_id');
$my_exercise_entry->get();

echo 'Amount is: ' . $my_exercise_entry->entry_amount;
// etc
...