我有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
吗?
答案 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);