Laravel Eloquent:如何在保存之前存储模型值?

时间:2016-04-28 16:36:23

标签: php laravel eloquent

我的一个模型中有自定义功能。它看起来像这样:

    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

之前将passwordusernamesave()存储为对象属性

相反,我想在一行中执行此操作,例如:

$this->store(['email' => $data['email], 'password' => $data['password], 'username' => $data['username']]);

$this->save();

我知道create()方法存在,但是当我使用它时,以下行 $this->profile()->save($profile);无效。我认为create()函数由于某种原因与save()的作用不同! 是否有与上述store()功能相同的内容?

5 个答案:

答案 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']; ... }