2010-01-13 82 views

回答

16

可以使用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我假设你正在谈论主义2.X

+0

我不是在谈论Doctrine2(我在2010年末提出问题),但现在,它解决了这个问题。 – rizidoro 2012-05-07 18:23:17

6

是的。

比方说,你有一个名为用户的模型。您有以下两类

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")); 
+0

谢谢回答特拉维斯,但它不是什么即时寻找。我想要做这样的事情: $ user = new User; $ user-> name =“rafael”; $ user-> category =“developer”; $ q = Doctrine :: getTable('User') - > findByExample($ user); 和$ q应返回“rafael”作为名称和“developer”作为类别的用户集合。你知道如何做到这一点? – rizidoro 2010-01-13 18:56:29

+0

检查使用findByDql方法的最后一段代码。这应该让你找到你想要的。 – Travis 2010-01-14 02:52:46