2017-02-25 3 views
0

DataObject를 확장하고 단순히 Title, Desc 및 Image가있는 클래스를 만들고 싶습니다.하나의 일반 DataObject와 has_many 관계가있는 많은 DataObject

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

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

이것은 프론트 엔드에 표시되는 일반 Tile이며 여러 페이지와 여러 DataObject에서 볼 수 있습니다. 주어진 페이지 나 DO는 이들 중 많은 것을 가질 수 있습니다. 명확히하기 위해, 이것은 단지 페이지를위한 것이 아닙니다. 나는 지역이 ImageBlocks의 has_many을 DO 있습니다

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' 
    ]; 

    .... 

내 질문은하는 데이터 객체에 has_many는 데이터 객체에 has_one 관계를 필요로한다. has_one 관계는 둘 이상의 가능한 클래스가 될 수 있으므로이 참조를 어떻게 만듭니 까?

[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'

내가 같은 오류가 발생합니다 :

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

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

그러나 나는이 오류가 :

나는 다음과 같이 이러한 개체 점유율 (데이터 객체)가 그 최소 공통 클래스에 has_one를 추가 시도 내가 ImageBlock에 has_one을 생략하려고 할 때. 어떤 질문을한다. 왜 Image 나 File 클래스와 같은 DataObject에 has_many 관계를 추가 할 수 있습니까? has_one 참조가 내 객체에 있습니까?

Silverstripe에서 일반 및 재사용 가능한 has_many 관련 개체를 가질 수없는 것으로 보입니다. 그리고이 ImageBlock을 가져야하는 모든 클래스는 has_one 참조를 추가하기위한 목적으로 클래스를 복제해야합니다.

답변

2

질문의 마지막 부분에 답하려면, has_many은 개략적으로 의미가 없습니다. 데이터베이스에 구조적 변경을 가하지 않습니다. 모든 일은 상위 데이터 객체에 마법 메서드를 추가하여 다른 곳의 has_one을 찾습니다. has_many을 정의하는 것은 기본적으로 편의를 위해 getter를 작성하는 시간을 절약 해줍니다.

부모의 관계를 정의하려는 경우 나에게 의미가있는 것은 many_many으로 처리 할 것입니다. 호혜성이 필요하지 않으므로 (belongs_many_many으로 왕복 할 수 있지만 이는 단지 편의입니다 방법도).

일관성과 명료성을 위해 many_many => ImageBlock을 삽입하려는 확장 프로그램을 만듭니다.

+0

다음은 [SilverStripe의 ORM 관계 다이어그램]입니다 (http://silverstrip.es/blog/diagram-of-relationships-in-silverstripe). – wmk

+0

감사합니다. 마지막 문장에서 네가 무엇을하는지 설명하거나 링크 할 수 있습니까? 나는 정말로 여기에 대한 답을 많이 보지 못했다. 지금까지 제가 알 수 있듯이 Silverstripe에서 일반적인 재사용 가능한 객체를 가질 수는 없습니다. 이 작업을 수행하는 방법을 알 수있는 유일한 방법은 기본 개체를 사용하고이를 사용하여 각 부모에 대해 특정 개체를 확장하는 것입니다. 그리고 그 수업에있는 것은 모두 has_one 관계입니다. – Aaryn

+0

재사용 가능하고 일반적인 것을 원한다면, 아마도 'has_many'가 아마도 최선의 접근법이 아닐 것입니다. 그러나이를 수행하는 한 가지 방법은 일반 ImageBlockHolder (추상 클래스)를 만드는 것입니다. 그러나 이것은 상속 체인을 부과하는보다 수직적 인 접근 방법입니다. 그렇게하고 싶다면 여기에 예제가 있습니다 (http://sspaste.com/paste/show/58b281b17ea91). 위 그림에서 설명한대로 (manysignal) "more_many"를 사용하는보다 수평적인 접근 방법 (http://sspaste.com/paste/show/58b2828816cab) – UncleCheese