2016-06-28 2 views
1

У меня есть DataObject под названием Applicant и его $has_oneMember (это класс SilverStripe Member).Получить отношение has_one в SilverStripe

private static $has_one = array (
    'MemberApplicant' => 'Member' 
); 

Когда член вошел в систему и посещает ApplicationPage я хочу, чтобы иметь возможность заполнить форму на основе членов Applicant данных.

Я могу сделать эту работу, но я чувствую, что мне легче получить доступ к данным.

Вот что я делаю:

$memberID = Member::currentUserID(); 
$applicant = Applicant::get()->filter('MemberApplicantID', $memberID)->first(); 

$form->loadDataFrom($applicant); 

Я не должен быть в состоянии создать экземпляр Member, а затем вызвать его относительной $MemberApplicant?

+0

Так один заявитель, связанный один член, и наоборот? Есть ли у одного члена один заявитель? Является заявителем - укажите его отношение 1: 1 или отношение 1: n? – wmk

ответ

3

Должен ли я не быть в состоянии создать экземпляр Member, а затем вызвать его относительный $ MemberApplicant?

Конечно. Я предполагаю, что у вас есть 1: 1 отношение, то вы должны определить встречную часть на Member с помощью $belongs_to (см this diagram)

class Applicant extends DataObject 
{ 
private static $has_one = [ 
    'MemberApplicant' => 'Member' 
]; 
... 

class MemberApplicantExtenension extends DataExtension 
{ 
private static $belongs_to = [ 
    'Applicant' => 'Applicant' 
]; 

... 

Теперь добавьте DataExtension к объекту-членов в /mysite/_config/config.yml

Member: 
    extensions: 
    - MemberApplicantExtenension 

и запустить dev/build? Flush.

Теперь вы можете получить соответствующий Заявитель члена с помощью встроенного в ОРМЕ магии:

//Get the current Member 
$member = Member::CurrentUser(); 

//get the $belongs_to 
$applicant = $member->Applicant(); 
2

Похоже, что вы хотите избежать «дополнительного» запроса ORM, пройдя запись Member текущего пользователя, однако это не так, как SilverStripe (или любая система, использующая SQL JOIN s).

Когда вы добавляете в класс $has_one, вы по существу добавляете внешний ключ в таблицу этого класса. В вашем случае он будет называться MemberApplicantID, который является внешним ключом для первичного ключа таблицы членов - его поле ID. Таким образом, ваш запрос ORM сначала должен пройти экземпляр Applicant.

Предостережение: Вышеупомянутое не совсем верно, DataObject позволяет вам определять статическую (SilverStripe config) статическую $belongs_to в ваших классах моделей, которая позволяет вам запрашивать «Другой способ». Я никогда не делал этого раньше, но похоже, что вы объявите это на обычном DataExtension, который украсит Member и имеет значение «Заявитель». См. DataObject::belongsToComponent().

Вы также можете немного упростить существующий запрос ОРМ без необходимости создавать экземпляр DataList явно, но путь к целевой данных остается неизменным:

// SilverStripe >= 3.2 
$applicant = DataObject::get_one('Applicant', array('MemberApplicantID = ?' => $memberID)); 

// SilverStripe < 3.2 
$applicant = DataObject::get_one('Applicant', '"MemberApplicantID" = ' . $memberID); 
Смежные вопросы