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.
ist ein [Diagramm der ORM Beziehungen in Silvers] (http://silverstrip.es/blog/diagram-of-relationships-in-silverstripe). – wmk
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
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