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


Laravel Eloquent: How to store model values before saving?

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

    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() 之前,我将emailpasswordusername存储为对象属性

相反,我想在一行中这样做,类似于:

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

我知道create()方法是存在的,但当我使用它时$this->profile()->save($profile);无法正常工作。我认为create()的功能与save()的功能不一样是因为某种原因是否有与上述store()函数等效的函数

您可以使用fill()方法来实现您想要的目标。

但在使用它之前,你应该知道一些事情。

由于安全原因,Laravel模型不受大规模分配的影响,要使用fill()方法,您需要定义可以使用fillableguarded属性填充模型的哪些属性。

<?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']
]);

没有对此进行测试,所以看看你的进展如何,如果你有任何进一步的问题,请留下评论。编码快乐!