2016-04-28 116 views
1

我在我的一个模型中有一个自定义函数。它看起来像这样: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); 
    } 

在这里,你可以看到我存储emailpasswordusername为对象的属性,命中save()

相反之前,我想做到这一点的一条线,东西像:

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

$this->save(); 

我知道,create()方法存在,但是当我用这个,下面一行 $this->profile()->save($profile);不起作用PR operly。由于某种原因,我认为create()功能与save()不一样! 是否有与上述的store()函数等价的函数?

回答

1

,你正在寻找的方法是fill

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

你可以用它用于创建和更新。

+0

哇!寻找这么久... – Ash

0

我不是100%确定我正确地理解了你,但它听起来像你想要创建一个在线更新而不用搞砸配置文件创建。在这种情况下,您可以简单使用update()方法:

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

为您保存新值。

+1

我认为他是创造而不是实际更新,虽然可能是错误的! – haakym

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

没有测试这只是看你如何得到并发表评论,如果您有任何进一步的问题。快乐的编码!

+0

这是行不通的 – Ash

+0

没有probs,感谢您的反馈! – haakym

0

您可以使用直接填写:

$this->fill($data); $this->save();

为对象属性将使用数组键,所以一定要确保你使用的是相同的。

此外,还要确保你已经在你的模型(http://laravel.com/docs/eloquent#mass-assignment)设置$可填写:

class x extends Eloquent { protected $fillable = ['email','password','username']; ... }

3

可以使用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属性功能,如白名单的质量分配。如果您需要其他方式,您可以使用功能类似于黑名单的属性。这意味着财产中所列的每一列都不可用于大规模分配,而其他所有内容都将是您的选择。

关于你的最后一句话,如果你看一下create()方法,你会发现,它接受一个普通的PHP阵列的实现方式,而save()方法将接受口才模型实例。这就是为什么create()将无法​​正常接收您的$profile变量。

我希望这会有所帮助。