Модель Кохана для распределения данных по нескольким таблицам - PullRequest
1 голос
/ 28 августа 2010

Я собираю сайт, управляемый БД, с помощью Kohana, и мне нужно иметь возможность отслеживать изменения. Итак, у меня есть данные за отдельными страницами в двух таблицах. Первая - это общая таблица сущностей, которую я использую для отслеживания всего содержимого сайтов. Он содержит основную информацию: идентификатор ресурса, псевдоним uri, имя пользователя, дату создания и пользователя публикации, а также модель содержимого. Таблица редакций содержит rev_id, идентификатор ресурса в виде FK, заголовок, содержимое страницы, создатель редакции, дату редакции и утверждающий публикации.

Сайт выполнит поиск страницы по идентификатору ресурса или псевдониму uri и вернет самую последнюю опубликованную ревизию. Однако из uri пользователь может откатить страницу до более ранних ревизий, включив верхний предел даты в uri или - # для отката # ревизий.

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

Создание новых страниц обновит обе таблицы, обновление страниц обновит одну таблицу, а удаление таблиц повлияет на одну таблицу.

Должен ли я создавать две модели, модель сущностей и модель пересмотра? Или мне нужна только одна логическая модель, которая абстрагирует реальную структуру?

1 Ответ

0 голосов
/ 24 апреля 2011

У меня была похожая проблема, и я выбрал способ с двумя моделями.Извините за пример кода, я написал его только для иллюстрации.Чтобы избежать проблем с изменениями структуры БД, я просто унаследовал модель ревизии от модели сущности и перегружал родительские поля (или просто сбрасывал их, если они не нужны)

Выглядело так:

<?php

// file /application/classes/model/page.php
class Model_Page extends Jelly_Model {

    public static function fields() {
        return array(
            'id' => new Field_Primary(),
            'content' => new Field_String(),
            'author' => new Field_BelongsTo(array(
                'foreign' => 'user',
                'column' => 'author_id'    
            )),
            'creation_date' => new Field_Integer(),
            'uri' => new Field_String()

        );
    }

    //here we init the model, using previously defined static method
    public static function initialize(Jelly_Meta $meta){
        $meta->table('pages')->fields(self::fields());
    }

}

// file /application/classes/model/page/draft.php
class Model_Page_Draft extends Model_Page {
    public static function initialize(Jelly_Meta $meta) {
        //here we inherit all the parent models' fields 
        //to skip the dirty work
        $fields = parent::fields();
        //then we overload model propertires
        //with fields relevant to draft model
        $fields['rev_id'] = new Field_Integer();
        //and choose other table to work with
        $meta->table('page_draft')->fields($fields);


    }
}

PS Извините, мой английский

...