2014-06-27 188 views
1

我是Symfony/Doctrine的新手。 我創建了2個實體來管理附加到它們的一些註釋和文檔: 這裏是comment entity,這裏comment document entity。 現在的問題是從數據庫這樣獲取數據時:Symfony2學說關聯結果

$comment = $em->getRepository('PathToBundle:Comment')->findOneBy(
     array('ordernumber' => '123456') 
    ); 

,並讓我們說我wan't調試它,所以我

print_r($comment); 

它打印的出這樣的事:

Path\ToBundle\Entity\Comment Object 
    (
     [id:Path\ToBundle\Entity\Comment:private] => 1 
     [ordernumber:Path\ToBundle\Entity\Comment:private] => 123456 
     [category:Path\ToBundle\Entity\Comment:private] => cat1 
     [comment:Path\ToBundle\Entity\Comment:private] => com1 
     [user:Path\ToBundle\Entity\Comment:private] => usr1 
     [version:Path\ToBundle\Entity\Comment:private] => 0 
     [documents:Path\ToBundle\Entity\Comment:private] => Doctrine\ORM\PersistentCollection Object 
      (
       [snapshot:Doctrine\ORM\PersistentCollection:private] => Array 
        (
        ) 

       [owner:Doctrine\ORM\PersistentCollection:private] => Path\ToBundle\Entity\Comment Object 
    *RECURSION* 
       [association:Doctrine\ORM\PersistentCollection:private] => Array 
        (
         [fieldName] => documents 
         [mappedBy] => comment 
         [targetEntity] => Path\ToBundle\Entity\CommentDocument 
         [cascade] => Array 
          (
          ) 

         [orphanRemoval] => 
         [fetch] => 2 
         [type] => 4 
         [inversedBy] => 
         [isOwningSide] => 
         [sourceEntity] => Path\ToBundle\Entity\Comment 
         [isCascadeRemove] => 
         [isCascadePersist] => 
         [isCascadeRefresh] => 
         [isCascadeMerge] => 
         [isCascadeDetach] => 
        ) 

它剛剛開始,它一直持續到瀏覽器崩潰。但如果嘗試訪問單個屬性,如

print_r($input->getComment()); 

它工作正常。

那麼這種行爲是否正常,或者我做錯了什麼?我怎樣才能訪問關聯的文檔表值?

回答

1

這很正常。請注意,您的第一個print_r嘗試位於Doctrine對象上,第二個位於字符串上。學說對象有很多層次,包含很多信息。而不是使用print_r嘗試使用Doctrine的Debug類,它允許您指定最大深度。

http://www.doctrine-project.org/api/common/2.4/class-Doctrine.Common.Util.Debug.html

\Doctrine\Common\Util\Debug::dump($comment, $maxDepth) 

如果你的實體是設置正確,你應該能夠通過

$comments->getDocuments(); 
訪問相關文件
1

這種行爲非常期待。由Doctrine提供的實體對象具有填充到它們中的功能的批號。轉儲原始對象將輸出大量數據。

也就是說,您不應該傾銷實體(或任何大類)對象。如果您需要調試信息,請將輸出限制爲僅與相關的內容相關。

我也認爲你誤解了像教條這樣的ORM的目的。

如何訪問關聯的文檔表值?

儘管通過Doctrine的類元數據工廠訪問原始數據庫功能(如表格信息)在技術上是可行的,但簡短的答案是您不想。 Doctrine抽象出底層的數據庫結構,試圖剝離抽象層,首先否定了使用ORM的全部理由。

專注於利用工具Doctrine爲您提供;引擎蓋下發生的事情並不重要,特別是對初學者來說。當然,對於高級技術來說,你的平臺的內部工作知識是必不可少的,比如用自定義代碼擴展基本的學說功能,儘管這不應該由初學者嘗試。你是否可以用現有的工具做你所需要的。)