情况:
有一个简单的User
类是Doctrine实体(我跳过了注释以保持代码简短):
class User {
protected $iUserId;
protected $sName;
}
问题:
如何从控制器中检索类User
的对象集合?
跟进:
到目前为止,我们在getUsers()
类中创建类似User
的方法,它从DB获取数据,创建User
类对象并返回它。
现在,我想知道创建像UserCollection
这样的类来处理数据检索和创建User
对象是不是更好的解决方案?也许我应该以某种方式使用\Doctrine\Common\Collections\Collection
课程?
我想要完成的是处理where
条款的简单方法。 UserCollection
类可以有QueryBuilder
个对象,我可以在这个对象上运行,如下所示:
$oUserCollection = new UserCollection();
$oUserCollection->setWhere( 'u.iUserId = 1' );
$aUsers = oUserCollection->getUsers();
...
请分享您对该主题的看法。
更新 Doctrine提供concept of repositories个实体,我认为这些实体可能是我正在寻找的解决方案。
答案 0 :(得分:1)
您有两种选择:
如果您的标准很简单,例如。你只想过滤一个属性,或者你根本不需要过滤,你可以使用EntityRepository上的findBy()和findAll()方法:
// find all users
$repository = $em->getRepository('My\\User');
$users = $repository->findAll();
// find users who are marked as active
$users = $repository->findBy(array('active' => true));
// sort users by age
$users = $repository->findBy(array(), array('age' => 'DESC'));
如果您有复杂的(呃)要求,或者您的发现者将在多个地方使用,您必须create a custom EntityRepository,并在那里将您的查找器逻辑分组。您必须在映射中指定要为此实体创建自己的EntityRepository,此方法取决于您使用的映射驱动程序(注释,yaml,xml)。例如,在yaml中,您必须将此行放在映射中:
RepositoryClass: My\Repository\UserRepository
然后创建文件:
namespace My\Repository;
use Doctrine\ORM\EntityRepository;
class UserRepository extends EntityRepository {
public function findVIPUsers() {
$query = $this->_em->createQuery("Your query here");
return $query->getResult();
// you can also use $this->findBy(), or $this->findAll() here
}
}
然后在您的控制器中,当您调用$ em-> getRepository('My \ User')时,它将返回您刚刚创建的自定义存储库。