findByExample в доктрине

Есть ли в Doctrine метод, подобный методу findByExample Hibernate?

Благодарность


person rizidoro    schedule 13.01.2010    source источник


Ответы (3)


Вы можете использовать метод findBy, который унаследован и присутствует во всех репозиториях.

Пример:

$criteria = array('name' => 'someValue', 'status' => 'enabled');
$result = $em->getRepository('SomeEntity')->findBy($criteria);

Вы можете создать метод findByExample в одном из ваших репозиториев, используя такое определение:

class MyRepository extends Doctrine\ORM\EntityRepository {
    public function findByExample(MyEntity $entity) {
        return $this->findBy($entity->toArray());
    }
}

Чтобы это работало, вам нужно будет создать собственный базовый класс для сущностей, реализующий метод toArray.

MyEntity также может быть интерфейсом, в котором ваши конкретные сущности должны будут снова реализовать метод toArray.

Чтобы сделать это доступным во всех ваших репозиториях, убедитесь, что вы расширяете базовый класс репозитория — в этом примере MyRepository.

P.S. Я предполагаю, что вы говорите о Doctrine 2.x

person Nikola Petkanski    schedule 08.12.2011
comment
Я не говорю о Doctrine2 (я задавал вопрос в конце 2010 года), но на данный момент это решает проблему. - person rizidoro; 07.05.2012

Да.

Допустим, у вас есть модель под названием «Пользователи». У вас есть следующие два класса

abstract class Base_User extends Doctrine_Record 
{
   //define table, columns, etc
}

class User extends Base_User
{

}

в каком-то другом объекте вы можете сделать

$user = new User;

//This will return a Doctrine Collection of all users with first name = Travis
$user->getTable()->findByFirstName("Travis");

//The above code is actually an alias for this function call
$user->getTable()->findBy("first_name", "Travis");

//This will return a Doctrine Record for the user with id = 24
$user->getTable()->find(24);

//This will return a Doctrine Collection for all users with name=Raphael and 
//type = developer
$user->getTable()
     ->findByDql("User.name= ? AND User.type = ?", array("Raphael", "developer"));
person Travis    schedule 13.01.2010
comment
Спасибо за ответ, Трэвис, но это не то, что я ищу. Я хочу сделать что-то вроде этого: $user = new User; $user-›name=рафаэль; $user-›category=разработчик; $q = Doctrine::getTable('Пользователь')->findByExample($user); и $q должен возвращать набор пользователей с rafael в качестве имени и разработчиком в качестве категории. Вы знаете, как это сделать? - person rizidoro; 13.01.2010
comment
Проверьте последний фрагмент кода, в котором используется метод findByDql. Это должно дать вам то, что вы ищете. - person Travis; 14.01.2010

$users = $userTable->findByIsAdminAndIsModeratorOrIsSuperAdmin(true, true, true);

См. http://www.doctrine-project.org/projects/orm/1.2/docs/manual/dql-doctrine-query-language/en

person Carlo Lopez    schedule 05.09.2011