我有一个名为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吗?
发布于 2016-06-28 06:52:39
难道我不能实例化一个成员,然后调用它的相对$MemberApplicant吗?
当然了。假设您有1:1的关系,那么您必须使用Member定义计数器部分,使用$belongs_to (参见这张图)。
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然后运行一个开发/构建?刷新。
现在,您可以使用ORM魔术从成员那里获得相关的申请者:
//Get the current Member
$member = Member::CurrentUser();
//get the $belongs_to
$applicant = $member->Applicant();发布于 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,但目标数据的路径保持不变:
// SilverStripe >= 3.2
$applicant = DataObject::get_one('Applicant', array('MemberApplicantID = ?' => $memberID));
// SilverStripe < 3.2
$applicant = DataObject::get_one('Applicant', '"MemberApplicantID" = ' . $memberID); https://stackoverflow.com/questions/38065028
复制相似问题