我的一个模型中有一个自定义函数。它看起来像这样:
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()
功能如上?
最佳答案
您可以使用 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
属性(property)将无法用于批量分配,其他一切都可以,这是您的选择。关于你的最后一条语句,如果你看一下 的实现
create()
方法你会发现它接受一个普通的php数组,而 save()
方法将接受一个 Eloquent 模型实例。这就是为什么 create()
无法收到您的 $profile
多变的。我希望这有帮助。
关于php - Laravel Eloquent : How to store model values before saving?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36920589/