Php Force通过关系创建雄辩的模型

Php Force通过关系创建雄辩的模型,php,laravel,eloquent,relationship,laravel-5.3,Php,Laravel,Eloquent,Relationship,Laravel 5.3,在一个使用Laravel 5.3和Stripe的小项目中,我试图通过hasOne关系在用户上强制创建订阅: //User.php 公共功能订阅(){ 返回$this->hasOne('App\Subscription'); } 公共功能订阅($data){ 返回$this->subscription()->forceCreate( //$data包含一些受保护的字段; //create()将直接忽略它们。。。 ); } 然而,我得到: 调用未定义的方法Illumb\Database\Query

在一个使用Laravel 5.3和Stripe的小项目中,我试图通过
hasOne
关系在
用户上强制创建
订阅

//User.php
公共功能订阅(){
返回$this->hasOne('App\Subscription');
}
公共功能订阅($data){
返回$this->subscription()->forceCreate(
//$data包含一些受保护的字段;
//create()将直接忽略它们。。。
);
}
然而,我得到:

调用未定义的方法Illumb\Database\Query\Builder::forceCreate()

即使
forceCreate()
是一个

你知道我如何模拟这种行为吗?或者我应该只
save
a
Subscription
手动分配每个字段吗?复杂的是,某些字段应该保持
保护
,例如
条带id

编辑 我的快速脏解决方案:

//User.php@subscribe($data)
返回(新订阅())
->强制填充([
'user_id'=>this->id,
//$包含敏感受保护数据的数据
])
->save();

我相信还有更好的办法

调用
$this->subscriptions()
返回类的实例,而不是类的实例

与and相反,类中没有实现
forceCreate()
。因此,在这种情况下没有第一手的API可供使用

看到了吗?当您调用
$this->subscriptions()->create()
时,您是在一个
有许多
实例而不是
模型
实例上调用
创建
方法。
Model
类有一个
forceCreate
方法这一事实与此无关

您可以使用该方法获取相关模型,然后调用
forceCreate()
unguared()

public函数订阅($data){
返回$this->subscription()
->getRelated()
->强制创建($数据);
}
但这种方法有一个严重的缺点;当我们从关系中提取模型时,它不会设置关系。要解决这个问题,你可以说:

public函数订阅($data)
{
//$data['user_id']=$this->id;
//或者更一般地说:
$data[$this->courses()->getPlainForeignKey()]=$this->courses()->getParentKey();
返回$this->courses()
->getRelated()
->强制创建($数据);
}
呃,似乎太老套了,不是我的方法。我更喜欢取消对底层模型的保护,调用
create
,然后重新调整它。大致如下:

public函数订阅($data)
{
$this->courses()->getRelated()->unguard();
$created=$this->courses()->create($data);
$this->courses()->getRelated()->reguard();
返回$created;
}
这样,您就不必手动设置外键

laravel/内部构件相关讨论: