Как изменить пустую строку на нуль с помощью Laravel 5.1?

При использовании Laravel 5.1 я пытаюсь проверить каждое значение перед его сохранением в базе данных с помощью Eloquent ORM. Моя логика такова: сначала обрезать значение, если значение представляет собой пустую строку "", а затем преобразовать ее в null, а не просто в пустую строку.

Мне посоветовали создать Trait, который переопределит для этого метод setAttribute.

Итак, вот что я сделал

У меня есть новая папка "app\Traits" внутри файла с именем TrimScalarValues.php, который содержит следующий код

<?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;, я не получаю белую страницу, но, очевидно, значения не обрезаются и не преобразуются в нуль.

Что я здесь делаю неправильно?


person Junior    schedule 29.07.2015    source источник


Ответы (4)


Вы не можете называть $this->setAttribute() в своей черте. Вместо этого вы хотите вызвать «оригинальный» метод setAttribute, используя parent:::

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

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

Что касается пустых журналов, вы проверяли журнал веб-сервера, кроме журнала из фреймворка?

person lukasgeiter    schedule 29.07.2015

У меня была та же проблема, и я решил ее, создав промежуточное программное обеспечение, которое фильтрует пустые поля ввода.

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< /а>

person Lukas    schedule 22.02.2016

Вы можете взглянуть на этот пакет: https://packagist.org/packages/iatstuti/laravel-nullable-fields

«Это создает черту и позволяет вам легко помечать атрибуты, которые должны быть установлены как нулевые при сохранении в базе данных».

Я знаю, что этот пост устарел, и в то время этого пакета, возможно, еще не существовало.

person HamzStramGram    schedule 29.04.2016

Вы можете использовать мутатор в вашей модели. Для поля 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, имя_аккаунта будет проходить через этот мутатор.

person Vitaliy Gura    schedule 29.07.2015
comment
но я не хочу делать это для каждого поля в моей базе данных. Если у меня много моделей столбцов/таблиц, это может стать вместо этого. Кроме того, is_null('') вернет false, что означает, что я ничего не делаю! - person Junior; 29.07.2015