2017-02-10 43 views
1

我有這個問題:我有幾個文件擴展了一些基礎文檔。所有這些文檔都有一些註釋功能,用戶可以向其添加註釋。因此,我有註釋文檔存儲在單獨的集合中(它需要被搜索並且不能被嵌入)並且擁有引用該註釋屬於的文檔的所有者屬性。我有麻煩主義造型的:繼承原則ODM雙向引用

<?php 

/** @ODM\MappedSuperclass */ 
abstract class Base { 
    /** @ODM\Id */ 
    public $id; 

    /** @ODM\ReferenceMany(targetDocument="Note", mappedBy="owner") */ 
    public $notes; 
} 


/** @ODM\Document */ 
class MyDocument extends Base { 
    /** @ODM\String */ 
    public $name; 
} 


/** @ODM\Document */ 
class Note { 
    /** @ODM\Id */ 
    public $id; 

    /** @ODM\ReferenceOne(targetDocument="Base", inversedBy="notes") */ 
    public $owner; 

    /** @ODM\String */ 
    public $text; 
} 

$mdoc = new MyDocument; 
$note = new Note; 

$mdoc->name = 'foo'; 
$note->text = 'bar'; 

$mdoc->notes[] = $note; 
$note->owner = $mdoc; 

$dm->persist($mdoc); 
$dm->persist($note); 

$dm->flush(); 

$dm->clear(); 

$note2 = $dm->find(Note::class, $note->id); 
echo $note2->owner->name; 

我也得到了:通知:未定義的屬性:Proxies__CG __ \基地:: $名稱。在其他情況下,我得到:無法找到標識符爲「XXX」的「Proxies__CG __ \ Base」文檔。

它顯然會嘗試加載基類而不是MyDocument。如何強制它加載正確的類?我嘗試將Base設置爲MappedSuperclass,設置鑑別器字段,省略targetDocument等。並且沒有按預期工作,並以不同的錯誤/錯誤行爲結束。

這甚至可能嗎?

可能相關:

注:沒有人幫真的還是我錯過了什麼。

回答

2

你缺少鑑別定義的基類:

/** 
* @ODM\MappedSuperclass 
* @ODM\InheritanceType("COLLECTION_PER_CLASS") 
* @ODM\DiscriminatorField("type") 
* @ODM\DiscriminatorMap({ 
*  "document"=MyDocument::class 
* }) 
*/ 
abstract class Base { 
    // ... 
} 

一旦你的,應該按預期工作。請注意,繼承類型也可以是SINGLE_COLLECTION,具體取決於您是要將文檔存儲在相同還是不同的集合中。

+0

非常感謝。只是說明:最低要求的部分是DiscriminatorField(我認爲id有一些默認值)。繼承類型可以省略(每個類的集合是默認的)和鑑別器映射(保存類名稱) –

+1

啊,小心點。繼承類型默認爲「無」。您可能在開發過程中沒有注意到它,但除非您設置了繼承類型,否則元數據緩存會忽略歧義字段。隨着下一個bug修復版本的發佈,這個問題將得到解決(詳情請參見PR [#1556](https://github.com/doctrine/mongodb-odm/pull/1556))。在此之前,請設置繼承類型以節省生產中的麻煩。 – alcaeus