我的一个模型中有一个自定义函数。它看起来像这样:
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);
}
在这里,您可以看到,在点击save()
之前,我将email
、password
和username
存储为对象属性
相反,我想在一行中这样做,类似于:
$this->store(['email' => $data['email], 'password' => $data['password], 'username' => $data['username']]);
$this->save();
我知道create()
方法是存在的,但当我使用它时$this->profile()->save($profile);
无法正常工作。我认为create()
的功能与save()
的功能不一样是因为某种原因是否有与上述store()
函数等效的函数
您可以使用fill()
方法来实现您想要的目标。
但在使用它之前,你应该知道一些事情。
由于安全原因,Laravel模型不受大规模分配的影响,要使用fill()
方法,您需要定义可以使用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
属性中列出的每一列都将不可用于批量分配,其他所有列都可用于批量指定,这是您的选择。
关于上一条语句,如果您查看create()
方法的实现,您会发现它接受一个常规php数组,而save()
的方法将接受一个Eloquent Model实例。这就是create()
接收$profile
变量无效的原因。
我希望这能有所帮助。
您要查找的方法是fill
:
$this->fill([
'email' => $data['email'],
'password' => $data['password'],
'username' => $data['username']]
);
$this->save();
您可以使用它来创建和更新。
您可以直接使用填充:
$this->fill($data);
$this->save();
它将使用数组键作为对象属性,因此请确保使用相同的键。
此外,请确保您已在模型中设置了$fillable(http://laravel.com/docs/eloquent#mass-任务):
class x extends Eloquent {
protected $fillable = ['email','password','username'];
...
}
我不能100%确定我是否正确理解你,但听起来你想在不破坏配置文件创建的情况下进行oneliner更新。在这种情况下,您可以简单地使用update()
方法:
$this->update(['email' => $data['email], 'password' => bcrypt($data['password]), 'username' => $data['username']]);
这样可以为您保存新的值。
那么运行$this->create()
时会发生什么呢?你有错吗?
考虑一下create()
将返回您创建的新对象,以便您可以尝试:
$user = $this->create([
'email' => $data['email],
'password' => $data['password],
'username' => $data['username']
]);
$user->profile()->create([
'name' => $data['name'],
'bio' => $data['bio']
]);
没有对此进行测试,所以看看你的进展如何,如果你有任何进一步的问题,请留下评论。编码快乐!