如何使用 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
找到这个
您可能想看看这个包裹:
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是旧的,那个时候这个包可能还不存在。
在使用 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::
:
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
找到这个您可能想看看这个包裹: 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是旧的,那个时候这个包可能还不存在。