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 참조를 추가하기위한 목적으로 클래스를 복제해야합니다.
다음은 [SilverStripe의 ORM 관계 다이어그램]입니다 (http://silverstrip.es/blog/diagram-of-relationships-in-silverstripe). – wmk
감사합니다. 마지막 문장에서 네가 무엇을하는지 설명하거나 링크 할 수 있습니까? 나는 정말로 여기에 대한 답을 많이 보지 못했다. 지금까지 제가 알 수 있듯이 Silverstripe에서 일반적인 재사용 가능한 객체를 가질 수는 없습니다. 이 작업을 수행하는 방법을 알 수있는 유일한 방법은 기본 개체를 사용하고이를 사용하여 각 부모에 대해 특정 개체를 확장하는 것입니다. 그리고 그 수업에있는 것은 모두 has_one 관계입니다. – Aaryn
재사용 가능하고 일반적인 것을 원한다면, 아마도 'has_many'가 아마도 최선의 접근법이 아닐 것입니다. 그러나이를 수행하는 한 가지 방법은 일반 ImageBlockHolder (추상 클래스)를 만드는 것입니다. 그러나 이것은 상속 체인을 부과하는보다 수직적 인 접근 방법입니다. 그렇게하고 싶다면 여기에 예제가 있습니다 (http://sspaste.com/paste/show/58b281b17ea91). 위 그림에서 설명한대로 (manysignal) "more_many"를 사용하는보다 수평적인 접근 방법 (http://sspaste.com/paste/show/58b2828816cab) – UncleCheese