Laravel: Как передать атрибут конструктору модели Eloquent - PullRequest
0 голосов
/ 03 августа 2020

Я хочу использовать strtolower () перед сохранением данных в базе данных для 5 атрибутов,

Я использую этот код в модели

public function setFirstNameAttribute($value)
{
    $this->attributes['firstName'] = strtolower($value);
}
public function setLastNameAttribute($value)
{
    $this->attributes['lastName'] = strtolower($value);
}
public function setUserNameAttribute($value)
{
    $this->attributes['userName'] = strtolower($value);
}
... etc

Могу ли я использовать метод __construct вместо код выше?

1 Ответ

3 голосов
/ 03 августа 2020

Есть два способа, первый - использовать метод загрузки напрямую (предпочтительнее для небольших изменений в модели, как в вашем вопросе)

Метод 1:
мы можем напрямую использовать метод загрузки,

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;


class Mymodel extends Model
{

    public static function boot()
    {
        parent::boot();

        static::saving(function ($model) {
                // Remember that $model here is an instance of MyModel
                $model->firstName = strtolower($model->firstName);
                $model->lastName = strtolower($model->lastName);
                $model->userName = strtolower($model->userName);
                // ...... other attributes
        });
    }
}


Метод 2:
Таким образом, мы можем использовать здесь простую черту с простым методом для генерации strtolower () для строки. предпочтительнее, когда вам нужно внести большие изменения в модель при выполнении операций с моделью, таких как сохранение, создание et c. Или даже если вы хотите использовать одно и то же свойство в нескольких моделях.
Создайте трейт MyStrtolower

<?php
namespace App\Traits;

trait MyStrtolower
{
    public function mystrtolower($string)
    {
        return strtolower($string);
    }
}

Теперь мы можем прикрепить этот трейт к любому классу, который мы хотим иметь с помощью метода mystrtolower.

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;
use App\Traits\MyStrtolower;

class Mymodel extends Model
{
    use MyStrtolower; // Attach the MyStrtolower trait to the model
 
    public static function boot()
    { 
        parent::boot();

        static::saving(function ($model) {
                // Remember that $model here is an instance of MyModel
                $model->firstName = $model->mystrtolower($model->firstName);
                $model->lastName = $model->mystrtolower($model->lastName);
                $model->userName = $model->mystrtolower($model->userName);
                // ...... other attributes
        });
    }
}

Если вы не хотите повторять все эти строки кода для каждой модели, которую вы создаете, сделайте свойство настраиваемым с помощью абстрактных методов, чтобы вы могли динамически передавать имена атрибутов, для которых вы хотите использовать строчную строку, например, employee_name is Employee Model и user_name in User Модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...