Выполнить метод для каждого экземпляра объекта определенного класса PHP - PullRequest
1 голос
/ 17 декабря 2010

Итак, у меня есть эта проблема в PHP, у меня есть класс с именем unit, который является ссылкой из таблицы, называемой модулями, поэтому, когда я обновляю строку в единицах таблицы, я должен обновить мой объектный блок, вызывая метод с именемrefresh (), например, $ unit-> refresh ().Это работает нормально для меня, потому что все обновления в одну строку производятся из объектного модуля.

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

Так что я подумал, может ли статический метод класса единиц сделать все созданные объекты типаunit, может заставить их вызывать метод refresh (), или, может быть, есть другой способ для работы (например, ORM или шаблон проектирования).У меня есть два реквизита: 1) я буду работать с posgtres, и я не буду менять это, 2) я использую много пользовательских функций и триггеров, а также сложный SQL (много вычислений времени и даты, выбор внутренних элементов и т. Д.).

Так что может быть полезным в такой ситуации?

Ответы [ 3 ]

2 голосов
/ 17 декабря 2010

Ваш юнит звучит как ActiveRecord .Хотя теоретически вы можете сделать так, чтобы ваша коллекция Units сделала что-то вроде этого:

public function refreshAll()
{
    foreach ($this->units as $unit) {
        if ($unit->isModified) {
            $unit->update()
        }
    }
}

Я настоятельно не рекомендую делать это , потому что это приведет к одному запросу на Unitпример.Обходы к базе данных чаще всего являются узким местом.Просто представьте, что вам нужно обновить пару сотен или даже тысяч экземпляров.

Лучше всего было бы просто собрать все запросы, требуемые в следующей транзакции, и выдать их в одном запросе, например, что-то вроде

public function refreshAll()
{
    $sql = '';
    foreach ($this->units as $unit) {
        if ($unit->isModified) {
            $sql .= $unit->getSql();
        }
    }
    // these are dummy method calls. 
    // i dont know if postgres supports transactions or multiqueries
    $this->dbAdapter->startTransaction();
    $this->dbAdapter->multiQuery($sql);
    $this->dbAdapter->commitOrRollback();
}

Другой вариант - использовать выделенный шаблон Единица работы .

Выдержки из Google Books:

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

0 голосов
/ 17 декабря 2010

Вы уже сказали ответ. Я бы выбрал ORM (поскольку при работе с PHP лучше всего ставить Doctrine . Как Гордон упомянул в комментариях "Unit of WorK", Doctrine использует этот шаблон именно для этой цели. Чтобы привести пример Обновление, посмотрите DOctrine Docs на обновление Объектов / Отношений.

Если ORM слишком тяжел для вас, то уже упомянутая Единица работы является вашим ответом, и вы можете написать собственное, легкое UoW для проекта. Этот пример объясняет Doctrine 2.0 UoW и что с ним делать.

0 голосов
/ 17 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...