如何使用 Laravel 5.1 将空字符串更改为 null?

How to change empty string to a null using Laravel 5.1?

在使用 Laravel 5.1 时,我试图在使用 Eloquent ORM 将每个值保存到数据库之前检查每个值。我的逻辑是,首先 trim 值,如果该值是空字符串 "",然后将其转换为 null 而不是空字符串。

有人建议我创建一个 Trait,它将为此覆盖 setAttribute 方法。

这就是我所做的

我在名为 TrimScalarValues.php 的文件中有一个新文件夹 "app\Traits",其中包含以下代码

<?php

namespace App\Traits;

trait TrimScalarValues
{
    public function setAttribute($key, $value)
    {
        if (is_scalar($value)) {
            $value = $this->emptyStringToNull(trim($value));
        }

        return $this->setAttribute($key, $value);
    }


    /**
     * return null value if the string is empty otherwise it returns what every the value is
     *
    */
    private function emptyStringToNull($string)
    {
        //trim every value
        $string = trim($string);

        if ($string === ''){
           return null;
        }

        return $string;
    }
}

最后我有一个 app\Models\Account.php 文件,其中包含以下代码

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\industry;
use App\Traits\RecordSignature;
use App\Traits\TrimScalarValues;


class Account extends Model
{
    use RecordSignature, TrimScalarValues;
    /**
     * The database table used by the model.
     *
     * @var string
    */
    protected $table = 'accounts';

    protected $primaryKey = 'account_id';

    const CREATED_AT = 'created_on';

    const UPDATED_AT = 'modified_on';

    const REMOVED_AT = 'purged_on';


    /**
     * The attributes that are mass assignable.
     *
     * @var array
    */
    protected $fillable = ['client_id','account_name', 'company_code', 'legal_name', 'created_by','modified_by','instrucations'];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
    */
    //protected $hidden = ['account_id', 'remember_token'];


    protected $guarded = ['account_id'];

    /**
     * Get the industry record associated with the account.
    */
    public function industry()
    {
        return $this->hasOne(industry, industry::primaryKey);
    }

    public function pk(){

        return $this->primaryKey;
    }

}

但是每次我更新一个值时,我都会得到一个没有错误或日志的白页。

当我修改 app\Models\Account.php 并将 use RecordSignature, TrimScalarValues; 更改为 use RecordSignature; 时,我没有得到白页,但显然这些值不是 trimmed 并转换为空。

我做错了什么?

您可以在模型中使用 mutator。 对于字段 account_name 增变器应该如下所示:

public function setAccountNameAttribute($account_name)
{
    if(is_null($account_name))
    {
        $this->attributes['account_name'] = null;
    }
    else
    {
        $this->attributes['account_name'] = $account_name;
    }
}

并且每次当您使用 Eloquent 更新或插入记录时,account_name 将通过此修改器传递。

你不能在你的特质中调用 $this->setAttribute()。相反,您想使用 parent:::

调用 "original" setAttribute 方法
public function setAttribute($key, $value)
{
    if (is_scalar($value)) {
        $value = $this->emptyStringToNull(trim($value));
    }

    return parent::setAttribute($key, $value);
}

关于空日志,除了framework的日志,你有没有查看webserver日志?

我遇到了同样的问题,并通过创建一个过滤空输入字段的中间件解决了这个问题。

public function handle($request, Closure $next) {
    $input = $request->all();
    if ($input) {
        array_walk_recursive($input, function (&$item) {
            $item = trim($item);
            $item = ($item == "") ? null : $item;
        });
        $request->merge($input);
    }
    return $next($request);
}

不要忘记将自定义中间件添加到 Http/Kernel。php

Laracasts

找到这个

您可能想看看这个包裹: https://packagist.org/packages/iatstuti/laravel-nullable-fields

"This create a trait and allows you to easily flag attributes that should be set as null when being persisted to the database."

我知道这个post是旧的,那个时候这个包可能还不存在。