2009-09-24 3 views
1

Я пытаюсь реализовать шаблон Active Record для проекта ZF. Раньше я работал с подобным соглашением, и он хорошо работает.ActiveRecord и многие-многие отношения?

Но теперь моя проблема заключается в том, как обрабатывать отношения «многие ко многим» с моими моделями.

Вот пример:

Допустим я модель пользователя.

<?php 
require_once 'MLO/Model/Model.php'; 

class Model_User extends MLO_Model_Model 
{ 
    protected $_data = array(
     'id' => NULL, 
     'email' => NULL, 
     'password' => NULL, 
    ); 
} 

Нет проблем.

Но что, если я добавлю модель группы?

require_once 'MLO/Model/Model.php'; 

class Model_Group extends MLO_Model_Model 
{ 
    protected $_data = array(
     'id' => NULL, 
     'name' => NULL, 
     'desc' => NULL, 
    ); 
} 

и

require_once 'MLO/Model/Collection.php'; 

class Model_Groups extends MLO_Model_Collection 
{ 
    protected $_modelClass = 'Model_Group'; 
} 

У меня есть то есть картографа, который преобразует результаты из БД для моделирования объекта, и наоборот.

Мой вопрос в том, как обращаться со многими-ко-многим отношениями с моими моделями?

Где я должен хранить отношения?

Вот некоторые подсказки я думать о:

class Model_User extends MLO_Model_Model 
{ 
    protected $_data = array(
     'id' => NULL, 
     'name' => NULL, 
     'desc' => NULL, 
     'groups' => NULL, // where groups will be an instance of the Model_Groups 
    ); 
} 

С таким же подходом, где группа будет массив как:

array(3) { 
    [0]=> 
    array(3) { 
    ["id"]=> 
    string(1) "9" 
    ["name"]=> 
    string(1) "Guest" 
    ["desc"]=> 
    string(1) "Some desc" 
    } 
    [1]=> 
    array(3) { 
    ["id"]=> 
    string(1) "64" 
    ["name"]=> 
    string(1) "Moderator" 
    ["desc"]=> 
    string(1) "Some desc" 
    } 
    [2]=> 
    array(3) { 
    ["id"]=> 
    string(1) "5" 
    ["name"]=> 
    string(1) "Admin" 
    ["desc"]=> 
    string(1) "Some desc" 
    } 
} 

Another идея?

P.S: Я не пытаюсь обрабатывать ACL или подобные вещи, это просто, к примеру.

ответ

0

Переведут вашу проблему размещать метки - один пост имеет много тегов и один тег используется со многими постами - это легко понятно (по крайней мере, для меня):

Я хотел бы добавить [ «метки»] на страницу Профиля $ _data, как вы предлагаете. И это будет массив прилагательных объектов тега. Аналогом для тега я бы добавил ['pages'] с прилагаемыми страницами. Но я, конечно, использовал бы ленивую загрузку.

+0

Таким образом, вы должны назначить как страницы, так и теги (или «Пользователи и группы в моем примере») «Достоверные теги и страницы» и передать имя класса в массиве для ленивой загрузки объекта Tag/Page? Что не так с использованием объекта коллекции, который содержит объекты тегов/страниц? –

+0

Конечно, вы можете использовать Collection ... :) Это совершенно то же самое - я просто привык делать это так, sry ... Проблема в том, что вы можете добраться до бесконечного цикла (загружать теги для страниц каждый объект страницы требует тегов , они загружаются, и каждый тег имеет Страницы, загружает Страницы ...), поэтому нужна ленивая загрузка. Также я бы рекомендовал использовать какой-то кеш для хранения результата, так как он мог бы получить интенсивную базу данных :) –

1

Zend_Db_Table имеет встроенную функциональность! :)

Он использует свои собственные понятия о «dependentTables» и «referenceMap» для управления таблицы отношений и даже может сделать CASCADE и DELETE вещи для вас, если ваша БД не поддерживает ограничения ссылочной

Zend_Db_Table Relationships

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