【问题标题】:Get has_one relation in SilverStripe在 SilverStripe 中获取 has_one 关系
【发布时间】:2016-06-28 00:00:35
【问题描述】:

我有一个名为 ApplicantDataObject$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吗?

【问题讨论】:

  • 所以一个申请人有一个相关的成员,反之亦然?一个成员是否恰好有一个申请人?申请人 - 成员是 1:1 关系还是 1:n 关系?

标签: php silverstripe


【解决方案1】:

难道我不能实例化一个成员,然后调用它的相关 $MemberApplicant 吗?

当然。我假设您有 1:1 的关系,那么您必须使用 $belongs_to 定义 Member 上的对应部分(请参阅 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 对象

Member:
  extensions:
    - MemberApplicantExtenension

并运行 dev/build?flush。

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

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

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

【讨论】:

    【解决方案2】:

    听起来您希望能够通过查看当前用户的Member 记录来避免“额外的”ORM 查询,但这不是 SilverStripe(或使用 SQL JOINs 的任何系统的工作方式)的方式。

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

    警告:以上内容并不完全正确,DataObject 确实允许您在模型类上定义一个私有(SilverStripe 配置)静态$belongs_to,它可以让您查询“反过来”。我以前从未真正这样做过,但看起来您确实会在自定义DataExtension 上声明它,该自定义Member 装饰Member 并具有“申请人”的值。见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); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 2013-11-24
      • 2017-11-17
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多