Php Force通过关系创建雄辩的模型
在一个使用Laravel 5.3和Stripe的小项目中,我试图通过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
hasOne
关系在用户上强制创建订阅
:
//User.php
公共功能订阅(){
返回$this->hasOne('App\Subscription');
}
公共功能订阅($data){
返回$this->subscription()->forceCreate(
//$data包含一些受保护的字段;
//create()将直接忽略它们。。。
);
}
然而,我得到:
调用未定义的方法Illumb\Database\Query\Builder::forceCreate()
即使forceCreate()
是一个
你知道我如何模拟这种行为吗?或者我应该只save
aSubscription
手动分配每个字段吗?复杂的是,某些字段应该保持保护
,例如条带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/内部构件相关讨论: