首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在has_one中得到SilverStripe关系

在has_one中得到SilverStripe关系
EN

Stack Overflow用户
提问于 2016-06-28 00:00:35
回答 2查看 880关注 0票数 1

我有一个名为DataObjectApplicant$has_one Member (这是SilverStripe Member类)。

代码语言:javascript
复制
private static $has_one = array (
    'MemberApplicant' => 'Member'
);

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

我可以使这个工作,但我觉得我应该能够更容易地访问数据。

以下是我所做的:

代码语言:javascript
复制
$memberID = Member::currentUserID();
$applicant = Applicant::get()->filter('MemberApplicantID', $memberID)->first();

$form->loadDataFrom($applicant);

难道我不能实例化一个Member然后调用它的相对$MemberApplicant吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-28 06:52:39

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

当然了。假设您有1:1的关系,那么您必须使用Member定义计数器部分,使用$belongs_to (参见这张图)。

代码语言:javascript
复制
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中的成员对象中

代码语言:javascript
复制
Member:
  extensions:
    - MemberApplicantExtenension

然后运行一个开发/构建?刷新。

现在,您可以使用ORM魔术从成员那里获得相关的申请者:

代码语言:javascript
复制
//Get the current Member
$member = Member::CurrentUser();

//get the $belongs_to
$applicant = $member->Applicant();
票数 3
EN

Stack Overflow用户

发布于 2016-06-28 02:22:34

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

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

警告:以上不是完全正确的,DataObject允许您在模型类上定义一个私有(SilverStripe配置)静态$belongs_to,它允许您查询“反过来”。我以前从来没有这样做过,但是看起来您确实会在一个定制的DataExtension上声明这一点,它装饰了Member并具有“申请者”的值。见DataObject::belongsToComponent()

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

代码语言:javascript
复制
// SilverStripe >= 3.2
$applicant = DataObject::get_one('Applicant', array('MemberApplicantID = ?' => $memberID));

// SilverStripe < 3.2
$applicant = DataObject::get_one('Applicant', '"MemberApplicantID" = ' . $memberID); 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38065028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档