通常,當我在原始PHP中使用MySQL時,我只選擇要與檢索到的數據集一起使用的字段;在高容量的環境中,儘可能減少數據傳輸是有意義的。Doctrine和Symfony2的效率
Doctrine允許您定義相關對象,這樣通過在實體定義中添加一兩行即可突然訪問Employee->Company->Fax
,這很酷。看起來(雖然我沒有檢查過這個),它在幕後做着SELECT *
。如果這是真的,有沒有辦法只拉我想我需要的領域?或者你認爲這是一個穩定的緩存方案的問題?
通常,當我在原始PHP中使用MySQL時,我只選擇要與檢索到的數據集一起使用的字段;在高容量的環境中,儘可能減少數據傳輸是有意義的。Doctrine和Symfony2的效率
Doctrine允許您定義相關對象,這樣通過在實體定義中添加一兩行即可突然訪問Employee->Company->Fax
,這很酷。看起來(雖然我沒有檢查過這個),它在幕後做着SELECT *
。如果這是真的,有沒有辦法只拉我想我需要的領域?或者你認爲這是一個穩定的緩存方案的問題?
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');
其中,當然,em
是entity manager