0

通常,当我在原始 PHP 中使用 MySQL 时,我只选择要用于检索到的数据集的字段;在大容量环境中,尽可能减少数据传输是有意义的。

很酷,Doctrine 允许您定义相关对象,这样,通过在实体定义中添加一两行,您就可以突然访问Employee->Company->Fax. 似乎(尽管我没有检查过)它在幕后工作SELECT *。如果这是真的,有没有办法只提取我认为我需要的字段?或者你认为这甚至是一个可靠的缓存方案的问题?

4

1 回答 1

2

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

其中,当然,ementity manager

于 2012-07-27T07:13:30.823 回答