0

情况:

有一个简单的User类是 Doctrine 实体(我跳过了注释以保持代码简短):

class User {
  protected $iUserId;
  protected $sName;
}

问题:
如何User从控制器中检索类对象的集合?

跟进: 到目前为止,我们一直在创建类getUsers()中的方法,这些方法User从数据库中获取数据,创建User类对象并返回它。

现在,我想知道创建UserCollection处理数据检索和创建User对象的类是否不是更好的解决方案?也许我应该以某种方式利用\Doctrine\Common\Collections\Collection类?

我想要完成的是处理 iewhere子句的简单方法。UserCollection类可以有QueryBuilder对象,我可以像这样从控制器操作它:

$oUserCollection = new UserCollection();
$oUserCollection->setWhere( 'u.iUserId = 1' );
$aUsers = oUserCollection->getUsers();
...

请分享您对该主题的看法。

更新: Doctrine 提供了实体存储库的概念,我认为这可能是我正在寻找的解决方案。

4

1 回答 1

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'));

如果您有复杂的(呃)要求,或者您的查找器将在多个地方使用,您将必须创建一个自定义 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') 时,它将返回您刚刚创建的自定义存储库。

于 2013-06-19T09:53:49.587 回答