Несколько таблиц для одной модели с использованием Zend_Model_Mappers и Zend_Db_Table_Abstract - PullRequest
0 голосов
/ 24 октября 2011

не уверен, что в последнее время я задаю слишком много вопросов о стековом потоке, но я чувствую, что документация Zend Framework ужасна. Кажется, что примеры очень расплывчаты и не похожи на то, что используется в реальном мире. Они поощряют использование фреймворка для аккуратного и организованного кода, а затем не упоминают, как ему следует следовать: D

Так или иначе! В старом приложении, которое я сейчас перевожу на Zend, у меня была бы функция с именем register, например:

function register($username, $password, $email, $etc) {
    // Do stuff
    // Insert $email and other stuff into `user_profile` table
    // Insert $username and $password into the `user` table
}

Но теперь с Zend ... Я следовал их учебному пособию по Гостевой книге, чтобы начать, и у меня есть следующие модели: User, UserMapper. И у меня есть DbTables для каждой таблицы в моей базе данных, например: User, UserProfile.

Так что мне нравится функциональность, когда вы регистрируетесь, вы создаете объект User и затем вызываете save в маппере, который записывает объект в базу данных, но дело в том, что некоторые из этих пользовательских частей переходят в профиль пользователя Таблица. Пример приложения гостевой книги состоит в том, что в UserMapper вы просто извлекаете одну таблицу (User) и пишете в нее ... ну, я имею в виду, что я мог бы просто сделать что-то вроде:

// Insert or Update data to user table
$this->getDbTable()->insert($user_data);
// Insert or Update User Profile data
$this->setDbTable('UserProfile');
$this->getDbTable()->insert($user_profile);

Но это кажется немного .. хакерским. Каков реальный рекомендуемый способ работы с несколькими таблицами?

Кроме того, если у меня есть пользовательские запросы ... я должен поместить их в созданный класс DbTable или в класс UserMapper? Я на самом деле не вижу, для чего на самом деле расширяется DbTable. Все, что говорится в руководстве, - это делать, и в действительности это не объясняет преимущества / причины / использование того, почему вы это делаете.

Спасибо, Дом

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Во-первых, вы не можете задавать слишком много вопросов о SO. Это то, для чего существует сайт, без вопросов = без ответов = без SO. :)

Ваш класс usermapper может иметь свойства $user и $userProfile и метод register(). Затем метод register получает доступ к нужным методам из этих таблиц. Приведенный ниже пример кода является базовым и не будет работать как есть, но он дает вам общую идею.

Вместо того чтобы наследовать свойства и методы одного класса, он использует композицию для предоставления доступа к нескольким классам. Другими словами, этот класс "имеет" Zend_Db_Tables, а не "является" Zend_Db_Table. Надеюсь, разница очевидна, и вы можете увидеть некоторые преимущества в работе таким образом.

В вашем контроллере: -

public function indexAction() {
    $userMapper = new Application_Model_Usermapper();
    $userMapper->register($username, $password, $email, $etc);
}

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

class Application_Model_Usermapper
{
    private $user;
    private $userProfile;

    public function __construct()
    {
        $config = array(
            'name'      => 'userTable',
            'primary'   => 'userid'
        );
        $this->user = new Zend_Db_Table($config);

        $config = array(
            'name'      => 'userProfileTable',
            'primary'   => 'userid'
        );
        $this->userProfile = new Zend_Db_Table($config);
    }

    public function register($username, $password, $email, $etc)
    {
        $this->user->insert($userdata);
        $this->userProfile->insert($userProfileData);
    }  
}
0 голосов
/ 24 октября 2011

Ваш класс Mapper должен взаимодействовать с несколькими таблицами, поэтому вам нужно несколько методов set / getDbTable, например:

public function setUserDbTable($dbTable) {}    
public function getUserDbTable() {}

public function setUserProfileDbTable($dbTable) {}    
public function getUserProfileDbTable() {}

Тогда в других ваших методах вы можете использовать соответствующую таблицу, например:

$this->getUserDbTable()->insert($userData);
$this->getUserProfileDbTable()->insert($userProfileData);

И аналогично для других взаимодействий в других методах.

...