在SilverStripe中获取has_one关系

时间:2016-06-28 00:00:35

标签: php silverstripe

我有DataObject名为Applicant$has_one Member(这是SilverStripe Member类。)

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

当会员登录并访问ApplicationPage时,我希望能够根据成员Applicant数据填充表单。

我可以完成这项工作,但我觉得我应该能够更轻松地访问数据。

以下是我的工作:

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

$form->loadDataFrom($applicant);

我不应该能够实例化Member,然后调用其相对$MemberApplicant吗?

2 个答案:

答案 0 :(得分:3)

  

我不能实例化一个成员然后调用其相对的$ MemberApplicant吗?

当然。我假设您有1:1的关系,那么您必须使用root@Sn00p:/etc/ssl/private# ls -la /etc/ssl/private/ssl-cert-snakeoil.key -rw-r----- 1 postgres postgres 1704 ژانوی 16 19:46 /etc/ssl/private/ssl-cert-snakeoil.key Member上定义计数器部分(请参阅this diagram

$belongs_to

现在将DataExtension添加到/mysite/_config/config.yml中的Member对象

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

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

...

并运行dev / build?flush。

现在,您可以使用内置的ORM魔法从会员中获取相关的申请人:

Member:
  extensions:
    - MemberApplicantExtenension

答案 1 :(得分:2)

听起来你希望能够避免额外的"通过浏览当前用户的Member记录进行ORM查询,但这不是SilverStripe(或任何使用SQL JOIN的系统都可以工作)的方式。

向类中添加$has_one时,实质上是在该类的表中添加了一个外键。在您的情况下,它将被称为MemberApplicantID,它是成员表的主键 - 其ID字段的外键。因此,您的ORM查询需要首先通过Applicant实例。

警告:上述情况并非完全正确,DataObject允许您在模型类上定义私有(SilverStripe配置)静态$belongs_to,以便您查询"反之亦然#34 ;.我之前从未实际做过这件事,但看起来你似乎是在一个自定义DataExtension上声明这个,它装饰Member并且值为"申请人&#34 ;。请参阅DataObject::belongsToComponent()

您还可以稍微简化现有的ORM查询,而无需显式实例化DataList,但到目标数据的路径保持不变:

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

// SilverStripe < 3.2
$applicant = DataObject::get_one('Applicant', '"MemberApplicantID" = ' . $memberID);