2017-02-10 7 views
1

Ich habe dieses Problem: Ich habe mehrere Dokumente, die einige Basisdokument erweitern. Alle diese Dokumente verfügen über eine Notizfunktion, mit der Benutzer Notizen hinzufügen können. Ich habe also ein Notiz-Dokument, das in einer separaten Sammlung gespeichert ist (es muss durchsucht werden können und nicht eingebettet werden können) und über eine Eigentümereigenschaft verfügen, die auf das Dokument verweist, zu dem die Notiz gehört. Ich habe Probleme Modellierung dieses mit Lehre:Doctrine ODM bidirektionale Referenz mit Vererbung

<?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; 

Und ich erhalte den: Hinweis: Nicht definierte Eigenschaft: Proxies__CG __ \ Base :: $ namen. In anderen Fällen habe ich: Das Dokument "Proxies__CG __ \ Base" mit der Kennung "XXX" konnte nicht gefunden werden.

Es versucht offensichtlich, die Base-Klasse anstelle von MyDocument zu laden. Wie man es zwingt, die korrekte Klasse zu laden? Ich versuchte, die Basis als MappedSuperclass zu setzen, Diskriminatorfeld zu setzen, targetDocument usw. wegzulassen. Und nichts funktioniert wie erwartet und endet mit verschiedenen Fehlern/falschen Verhaltensweisen.

Ist das überhaupt möglich?

Möglicherweise verwandte:

Hinweis: keiner von ihnen wirklich geholfen, oder ich etwas verpasst.

Antwort

2

Sie verpassen eine Scheidungs ​​Definition für die Basisklasse:

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

Sobald Sie, dass, sollte es wie erwartet funktionieren. Beachten Sie, dass der Vererbungstyp auch SINGLE_COLLECTION sein kann, je nachdem, ob Sie die Dokumente in derselben oder in verschiedenen Sammlungen speichern möchten.

+0

Vielen Dank. Nur der Hinweis: Der minimal erforderliche Teil ist das DiscriminatorField (ich dachte, ID hätte einen Standardwert). Der Vererbungstyp kann weggelassen werden (Sammlung nach Klasse ist Standard) und auch die Diskriminatorkarte (speichert den Klassennamen) –

+1

Ah, vorsichtig dort. Vererbungstyp ist standardmäßig "keine". Sie werden es möglicherweise nicht in der Entwicklung bemerken, aber Metadatencaches lassen Diskriminatorfelder aus, es sei denn, Sie legen einen Vererbungstyp fest. Mit der nächsten Bugfix-Version wird dies behoben (siehe PR [# 1556] (https://github.com/doctrine/mongodb-odm/pull/1556) für Details). Bis dahin, legen Sie einen Vererbungstyp fest, um sich Probleme bei der Produktion zu ersparen. – alcaeus

Verwandte Themen