PHP Doctrine: фильтрация данных, которые уже загружены? - PullRequest
1 голос
/ 23 марта 2010

Я новичок в Doctrine и ActiveRecord.

Как мне отфильтровать таблицу после ее загрузки? (я полагаю, это предпочтительнее, чем отправка нескольких запросов?)

Это "хорошо" или "плохо"?

class UserTable extends Doctrine_Table {
    function filterByGroup($group) {
        $ut = new UserTable();
        foreach($this as $u) {
            if($u->group == $group) $ut->add($u);
        }
        return $ut;
    }
}

Edit:

Я понимаю, что есть встроенные функции, которые выполняют функцию фильтрации. Но будут ли два следующих кодовых блока работать по-разному в отношении производительности?

//1
$users = Doctrine_Core::getTable('Users')->findAll();
$admins = Doctrine_Core::getTable('Users')->findByGroupName('admin');
//2
$admins = Doctrine_Core::getTable('Users')->findByGroupName('admin');
$users = Doctrine_Core::getTable('Users')->findAll();

1 Ответ

2 голосов
/ 23 марта 2010

Во-первых, ваш оператор if назначает $ u-> group для $ u, а не сравнивает их.Не упустите = и == (и ===).

Доступны встроенные функции "findBy" (см. http://www.doctrine -project.org / Doctrine_Table / 1_2 # method_findby ) делать что хочешь.Вы, конечно, захотите установить соответствующие индексы для поля, по которому вы фильтруете.

В примечании следует избегать использования слова "группа" в качестве поля, поскольку оно является ключевым словом SQL.По крайней мере, назовите его «group_name» или что-то в этом роде.

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

$users = Doctrine_Core::getTable('User')->findByGroupName($name);
...