通常当我在原始PHP中使用MySQL时,我只选择我要用于检索数据集的字段;在高容量环境中,尽可能减少数据传输是有意义的。
Doctrine允许您定义相关对象,这很酷,通过在实体定义中添加一行或两行,您可以突然访问Employee->Company->Fax
。看来(虽然我没有检查过)幕后它正在做SELECT *
。如果这是真的,有没有办法只拉我认为我需要的字段?或者您认为这是一个稳固的缓存方案的问题吗?
答案 0 :(得分:2)
在symfony2中的Doctrine和Entity Manager,就像你描述的那样。
当您从数据库中获取对象时,doctrine将为您执行SELECT *
。
此外,如果您想通过foreign key
访问某些相关媒体资源,则说明会使用lazy loading表示您无需在查询中指定如何检索一些字段,因为教义alredy知道如何。最好的事情是,由于您调用该字段(在条件语句中很好等等)
回到您的问题,您只能检索您感兴趣的字段。第一步是为您的类对象定义repository
。第二种是编写 DQL 查询(Doctrine查询语言)以仅提取“您的”字段。
这是一个示例,其中有一个名为User
的类和一个名为UserRepository
的相关存储库
<?php
namespace CompanyName\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\Common\Collections\ArrayCollection;
/**
* CompanyName\UserBundle\Entity\User
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="CompanyName\UserBundle\Repository\UserRepository")
*/
class User implements AdvancedUserInterface
{
[...]
“有趣”的部分是
@ORM\Entity(repositoryClass="CompanyName\UserBundle\Repository\UserRepository")
现在是存储库的代码:
<?php
namespace CompanyName\UserBundle\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\NoResultException;
/**
* UserRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class UserRepository extends EntityRepository implements UserProviderInterface
{
private $qb = Null;
public function getOrCreateQB()
{
if(!$this->qb) {
$this->qb = $this->createQueryBuilder('u');
}
return $this->qb;
}
public function loadUserByUsername($username)
{
/* some logic */
/* define $q as the DQL query for column
that I interested in */
$user = $q->getSingleResult();
return $user;
}
[...]
你得到了你想要的东西。要使用“自定义”查询,只需按以下方式使用该存储库
$userRepo = $this->em->getRepository('SestanteUserBundle:User');
$this->userRepo->loadUserByUsername('userNameExample');
当然,em
是entity manager