PHP模式 - 如何检索对象的集合

时间:2013-06-17 08:51:23

标签: php design-patterns doctrine-orm

情况:

有一个简单的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个实体,我认为这些实体可能是我正在寻找的解决方案。

1 个答案:

答案 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')时,它将返回您刚刚创建的自定义存储库。