[英]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()
之前將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-assignment ):
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']
]);
沒有測試這個,所以看看你是怎么做的,如果你有任何進一步的問題,請發表評論。 快樂編碼!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.