Как лучше всего решить эту проблему в модели? - PullRequest
0 голосов
/ 23 июля 2010

Я часто сталкиваюсь с этим, и мне всегда было любопытно, есть ли лучший способ.

Подумайте об этом (только в качестве примера, предположим построитель запросов OO)

class Dogs extends Pets {

    public function getAll() {
        return $this->parseRows($this->db->get('dogs'));
    }

    public function getBig() {
        return $this->parseRows($this->db->get('dogs')->where('size', '>', 10));
    }

    public function getSmelly() {
        return $this->parseRows($this->db->get('dogs')->where('smell', '=', 'bad'));
    }

    private function parseRows($rows) {
        foreach($rows as &$row) {
            $row['id'] = (int) $row['id'];
            $row['categoryName'] = Categories::getById($row['categoryId']);
        }
        return $rows;
    }

}

В основном,Мне нужно использовать много запросов к базе данных, но все они должны пройти постобработку, чтобы назначить им вещи.Я использовал шаблон, описанный выше.

Это лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 23 июля 2010

Публичный интерфейс мне кажется приличным.Что касается реализации, то многое можно сказать, поскольку объектно-реляционные преобразователи являются одним из краеугольных камней современного программирования IMHO.

Если вы хотите узнать больше об альтернативных способах реализации ORM, я быпредлагаю взглянуть на фреймворки с открытым исходным кодом, такие как Doctrine или CakePHP ORM.

Одна заметка, которую я хотел бы добавить относительно частной реализации: если Categories :: getById выполняет вызов в обе стороны базы данных, это неэффективно,поскольку таблица со многими собаками привела бы (по крайней мере) к большому количеству вызовов дб, что является неоптимальным.Вот почему ORM, такие как упомянутые выше, позволяют разработчику определять ассоциации (например, у Dog есть Category) и автоматически генерировать операторы «LEFT JOIN».

0 голосов
/ 23 июля 2010

Я предпочитаю использовать Symfony и Propel 1.5 вместо Doctrine. В Propel 1.5 вы можете генерировать объектно-ориентированные запросы, такие как:

http://www.propelorm.org/wiki/Documentation/1.5/WhatsNew

Удачи

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