我的一个模型中有自定义功能。它看起来像这样:
public function newWithTeam($data, $team_id = false){
$levels = Permissions::get_levels();
$this->email = $data['email'];
$this->password = bcrypt($data['password']);
$this->username = $data['username'];
$this->save();
$profile = new Profile(['name' => $data['name'],'bio' => $data['bio']]);
$this->profile()->save($profile);
}
在此处,您可以看到我在email
password
,username
和save()
存储为对象属性
相反,我想在一行中执行此操作,例如:
$this->store(['email' => $data['email], 'password' => $data['password], 'username' => $data['username']]);
$this->save();
我知道create()
方法存在,但是当我使用它时,以下行
$this->profile()->save($profile);
无效。我认为create()
函数由于某种原因与save()
的作用不同! 是否有与上述store()
功能相同的内容?
答案 0 :(得分:4)
您可以使用 fill()
方法来实现您的目标。
但在使用它之前,你应该知道一些事情。
出于安全原因,Laravel模型可以防止大规模分配,使用 fill()
方法,您需要使用 {定义模型的哪些属性可以填充{1}} 或 fillable
属性。
guarded
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class UserModel extends Model
{
protected $fillable = ['email', 'password', 'username'];
public function newWithTeam($data, $team_id = false){
$levels = Permissions::get_levels();
$this->fill([
'email' => $data['email'],
'password' => bcrypt($data['password']),
'username' => $data['username']
]);
$this->save();
$profile = new Profile([
'name' => $data['name'],
'bio' => $data['bio']
]);
$this->profile()->save($profile);
}
}
属性的功能类似于质量分配的白名单。如果您想要另一种方式,可以使用 fillable
属性,该属性的功能类似于黑名单。这意味着 guarded
属性中列出的每个列都不可用于批量分配,其他所有内容都可以,这是您的选择。
关于你的上一个陈述,如果你看一下 guarded
方法的实现,你会发现它接受一个常规的php数组,而 create()
方法将接受Eloquent Model实例。这就是 save()
无法接收 create()
变量的原因。
我希望这会有所帮助。
答案 1 :(得分:2)
您正在寻找的方法是fill
:
$this->fill([
'email' => $data['email'],
'password' => $data['password'],
'username' => $data['username']]
);
$this->save();
您可以将其用于创建和更新。
答案 2 :(得分:0)
我不是百分百肯定我理解正确,但听起来你想要在没有搞砸个人资料创建的情况下进行oneliner更新。在这种情况下,您只需使用update()
方法:
$this->update(['email' => $data['email], 'password' => bcrypt($data['password]), 'username' => $data['username']]);
为您保存新值。
答案 3 :(得分:0)
那么当你运行$this->create()
时会发生什么?你收到错误吗?
考虑create()
将返回您创建的新对象,以便您可以尝试:
$user = $this->create([
'email' => $data['email],
'password' => $data['password],
'username' => $data['username']
]);
$user->profile()->create([
'name' => $data['name'],
'bio' => $data['bio']
]);
没有对此进行测试,所以如果您有任何进一步的问题,请查看您如何继续并发表评论。快乐的编码!
答案 4 :(得分:0)
您可以直接使用填充:
$this->fill($data);
$this->save();
它将使用数组键作为对象属性,因此请确保您使用相同的属性。
另外,请确保您已在模型中设置$ fillable(http://laravel.com/docs/eloquent#mass-assignment):
class x extends Eloquent {
protected $fillable = ['email','password','username'];
...
}