学说和Symfony的效率2

时间:2012-07-27 05:11:39

标签: symfony doctrine-orm

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

Doctrine允许您定义相关对象,这很酷,通过在实体定义中添加一行或两行,您可以突然访问Employee->Company->Fax。看来(虽然我没有检查过)幕后它正在做SELECT *。如果这是真的,有没有办法只拉我认为我需要的字段?或者您认为这是一个稳固的缓存方案的问题吗?

1 个答案:

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

当然,ementity manager

的一个实例