2017-02-25 1 views
0

Ich möchte eine Klasse erstellen, die DataObject erweitert und einfach einen Titel, eine Beschreibung und ein Bild hat.Viele DataObjects mit has_many-Beziehung zu einem generischen DataObject

Dies ist eine generische Kachel, die im Frontend angezeigt wird und auf mehreren Seiten und in mehreren DataObjects angezeigt werden kann. Eine bestimmte Seite oder DO kann viele davon haben. Um dies zu verdeutlichen, ist dies nicht nur für Seiten. Ich habe eine Region tun, die has_many dieses ImageBlocks:

class TourRegion extends \DataObject 
{ 
    private static $db = [ 
     'RegionName' => 'Varchar(50)', 
     'RegionSlug' => 'Varchar(50)', 
     'RegionIntro' => 'Varchar(255)', 
     'RegionDescription' => 'Text', 
    ]; 

    private static $has_many = [ 
     'RegionHeroImages' => 'TourHeroImage', 
     'MainAttractions' => 'ImageBlock' 
    ]; 

    .... 

Meine Frage ist, ein has_many zu einem Datenobjekt erfordert eine has_one Beziehung zu diesem Datenobjekt. Da die has_one-Beziehung mehr als eine mögliche Klasse sein kann, wie erstelle ich diese Referenz?

Ich habe versucht, eine has_one auf den kleinsten gemeinsamen Klasse hinzu, dass diese Objekte Aktie (Datenobjekt) wie folgt:

[User Error] Uncaught Exception: No has_one found on class 'ImageBlock', the has_many relation from 'TourRegion' to 'ImageBlock' requires a has_one on 'ImageBlock'

ich den gleichen Fehler:

class ImageBlock extends DataObject 
{ 
    private static $db = [ 
     'Title' => 'Varchar(50)', 
     'Description' => 'Varchar(255)' 
    ]; 

    private static $has_one = [ 
     'Image' => 'Image', 
     'ParentObject' => 'DataObject' 
    ]; 
} 

Aber ich habe diesen Fehler wenn ich versuche, has_one auf ImageBlock ganz wegzulassen. Was wirft die Frage auf; Warum kann ich has_many-Beziehungen zu DataObjects wie Image oder File hinzufügen, ohne dass die Image- oder File-Klasse eine has_one-Referenz auf mein Objekt hat?

Es scheint, dass es nicht möglich ist, generische und wiederverwendbare has_many verwandte Objekte in Silverstripe zu haben. Und jede Klasse, die diesen ImageBlock haben muss, muss die Klasse duplizieren, nur um die has_one-Referenz hinzuzufügen.

Antwort

2

Um den letzten Teil Ihrer Frage zu beantworten, ist es wichtig sich daran zu erinnern, dass has_many schematisch bedeutungslos ist. Es enthält keine strukturellen Änderungen an Ihrer Datenbank. Alles was es tut, ist eine magische Methode zu dem übergeordneten DataObject hinzuzufügen, die woanders nach einem sucht. Das Definieren eines has_many ist im Grunde nur für die Bequemlichkeit, um Ihnen die Zeit des Schreibens eines Getters zu sparen.

Wenn Sie schauen, die Beziehung in den Eltern zu definieren, das für mich Sinn macht, würde ich das als many_many, als dass keine Gegenseitigkeit erfordert (Es kann durch belongs_many_many hin- und herbewegt werden, aber das ist nur eine Bequemlichkeit Methode auch).

Für Konsistenz und Klarheit, würde ich eine Erweiterung zu injizieren die zu den DOs, die es wollen. Hier

+0

ist ein [Diagramm der ORM Beziehungen in Silvers] (http://silverstrip.es/blog/diagram-of-relationships-in-silverstripe). – wmk

+0

Danke. Kannst du erklären, was du in deinem letzten Satz gesagt hast? Ich sehe hier wirklich keine große Antwort. Soweit ich das beurteilen kann, ist es nicht möglich generische wiederverwendbare Objekte in Silverstripe zu haben. Der einzige Weg, wie ich dies sehen kann, ist ein Basisobjekt, das dann verwendet wird, um ein bestimmtes Objekt für jeden Elternteil zu erweitern, der es verwenden möchte. Und alles, was in diesen Klassen ist, ist eine has_one-Beziehung. – Aaryn

+0

Wenn Sie etwas wiederverwendbar und generisch wollen, dann ist 'has_many' wahrscheinlich nicht der beste Ansatz. Ein Weg, dies zu tun, wäre jedoch, einen generischen 'ImageBlockHolder' (zB eine abstrakte Klasse) zu erstellen, aber das ist ein eher vertikaler Ansatz, der eine Vererbungskette vorschreibt. Wenn du das machen wolltest, hier ist ein Beispiel (http://sspaste.com/paste/show/58b281b17ea91). Alternativ, ein horizontaler Ansatz mit 'many_many', wie ich oben beschrieben hier veranschaulicht (http://ssppaste.com/paste/show/58b2828816cab) – UncleCheese

Verwandte Themen