我想创建一个扩展DataObject的类,只需要一个Title,Desc和Image。
class ImageBlock extends DataObject
{
private static $db = [
'Title' => 'Varchar(50)',
'Description' => 'Varchar(255)'
];
private static $has_one = [
'Image' => 'Image'
];
}
这是在前端显示的通用Tile,可以显示在多个页面和多个DataObjects中。给定页面或DO可以具有许多这些。澄清一下,这不仅仅适用于页面。我有一个区域DO,其中包含以下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'
];
....
我的问题是,DataObject的has_many需要在该DataObject上有一个has_one关系。由于has_one关系可能不止一个类,我该如何创建此引用?
我尝试将has_one添加到这些对象共享的最低公共类(DataObject),如下所示:
class ImageBlock extends DataObject
{
private static $db = [
'Title' => 'Varchar(50)',
'Description' => 'Varchar(255)'
];
private static $has_one = [
'Image' => 'Image',
'ParentObject' => 'DataObject'
];
}
但是我收到了这个错误:
[用户错误]未捕获异常:在课程中找不到has_one ' ImageBlock',来自' TourRegion'的has_many关系至 ' ImageBlock'需要一个on_one on' ImageBlock'
当我尝试在ImageBlock上完全省略这个has_one时,我得到了同样的错误。这引出了一个问题;为什么我可以添加has_many关系到DataObjects,比如Image或File,而Image或File类没有has_one引用我的Object?
似乎在Silverstripe中不可能有泛型和可重用的has_many相关对象。并且每个需要拥有此ImageBlock的类必须复制该类,仅用于添加has_one引用。
答案 0 :(得分:2)
要回答问题的最后部分,重要的是要记住has_many
显然是毫无意义的。它不会对您的数据库进行任何结构更改。它所做的就是为父DataObject添加一个魔术方法,在其他地方寻找has_one
。定义has_many
基本上只是为了方便,为您节省编写getter的时间。
如果你想在父母中定义关系,这对我来说是有意义的,我会以many_many
来做,因为它不需要互惠(它可以通过belongs_many_many
回复,但这只是一种方便的方法。)
为了保持一致性和清晰度,我会创建一个扩展,将many_many => ImageBlock
注入到想要它的DO中。