2012-07-27 35 views
0

通常,當我在原始PHP中使用MySQL時,我只選擇要與檢索到的數據集一起使用的字段;在高容量的環境中,儘可能減少數據傳輸是有意義的。Doctrine和Symfony2的效率

Doctrine允許您定義相關對象,這樣通過在實體定義中添加一兩行即可突然訪問Employee->Company->Fax,這很酷。看起來(雖然我沒有檢查過這個),它在幕後做着SELECT *。如果這是真的,有沒有辦法只拉我想我需要的領域?或者你認爲這是一個穩定的緩存方案的問題?

回答

2

symfony2中的主義和實體管理器的行爲非常類似於您所描述的。
當你從數據庫中獲取一個對象時,doctrine會爲你做一個SELECT *
此外,如果您想通過foreign key訪問某些相關屬性,則原則將使用lazy loading,這意味着您不必指定查詢如何檢索某些字段,因爲學習者知道如何。最好的事情是,自從您調用該字段後,查詢就沒有完成(條件語句等很好)

回到您的問題,您只能檢索那些您感興趣的字段。第一步是爲你的類對象定義一個repository。第二個是寫一個DQL查詢(學說查詢語言)來只提取「你的」字段。

這裏有一個例子,我有一個名爲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

實例
相關問題