簡體   English   中英

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()方法,您需要定義可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM