通常,当我在原始 PHP 中使用 MySQL 时,我只选择要用于检索到的数据集的字段;在大容量环境中,尽可能减少数据传输是有意义的。
很酷,Doctrine 允许您定义相关对象,这样,通过在实体定义中添加一两行,您就可以突然访问Employee->Company->Fax
. 似乎(尽管我没有检查过)它在幕后工作SELECT *
。如果这是真的,有没有办法只提取我认为我需要的字段?或者你认为这甚至是一个可靠的缓存方案的问题?
通常,当我在原始 PHP 中使用 MySQL 时,我只选择要用于检索到的数据集的字段;在大容量环境中,尽可能减少数据传输是有意义的。
很酷,Doctrine 允许您定义相关对象,这样,通过在实体定义中添加一两行,您就可以突然访问Employee->Company->Fax
. 似乎(尽管我没有检查过)它在幕后工作SELECT *
。如果这是真的,有没有办法只提取我认为我需要的字段?或者你认为这甚至是一个可靠的缓存方案的问题?
symfony2 中的 Doctrine and Entity Manager 的行为与您描述的非常相似。
当你从数据库中获取一个对象时,学说会SELECT *
为你做一个。
此外,如果您想通过 访问某些相关属性foreign key
,则学说将使用延迟加载,这意味着您无需在查询中指定如何检索某些字段,因为学说已经知道如何检索。最好的事情是查询没有完成,因为你调用了那个字段(在条件语句中很好等等)
回到您的问题,您只能检索您感兴趣的那些字段。第一步是repository
为您的类对象定义一个。第二种是编写一个DQL查询(Doctrine Query Language)来只提取“你的”字段。
这是一个示例,其中我有一个名为的类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