许多DataObjects与一个通用DataObject具有has_many关系

时间:2017-02-25 06:12:38

标签: silverstripe

我想创建一个扩展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引用。

1 个答案:

答案 0 :(得分:2)

要回答问题的最后部分,重要的是要记住has_many显然是毫无意义的。它不会对您的数据库进行任何结构更改。它所做的就是为父DataObject添加一个魔术方法,在其他地方寻找has_one。定义has_many基本上只是为了方便,为您节省编写getter的时间。

如果你想在父母中定义关系,这对我来说是有意义的,我会以many_many来做,因为它不需要互惠(它可以通过belongs_many_many回复,但这只是一种方便的方法。)

为了保持一致性和清晰度,我会创建一个扩展,将many_many => ImageBlock注入到想要它的DO中。