Назначение в конструкторе модели не работает - PullRequest
2 голосов
/ 08 мая 2019

У меня есть машина с двумя столбцами: user_id и token

. Я хотел бы только пропустить user_id при создании и автоматически создать токен:

$car = Car::create([
        'user_id' => $user->id,
]);

это мой класс автомобиля:

class Car extends Model
{
    protected $guarded = [];

    public function __construct()
    {
      parent::__construct();
      $this->token = mb_substr(bin2hex(openssl_random_pseudo_bytes(32)),0,8);
    }

Когда я создаю автомобиль, поле token вставляется правильно.Однако поле user_id является нулевым.

Когда я удаляю метод __construct(), user_id вставляется правильно (но тогда токена нет).

Я не понимаю, почему присваивание в конструкторе удаляет user_id.

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Вместо создания токена в конструкторе вы можете воспользоваться событиями модели Laravel . Короче говоря, это позволяет вам прослушивать событие (например, «создано», «обновлено» и т. Д.) И выполнять действие с этим событием. Если вы замените конструктор следующим, это должно решить проблему:

public static function boot()
{
    self::created(function ($model) {
        $model->update([
            'token' = mb_substr(bin2hex(openssl_random_pseudo_bytes(32)),0,8);
        ]);
    });
    // If you're using the SoftDeletes trait, uncomment this line.
    // static::bootSoftDeletes();
}

Вы создадите экземпляр вашей Car модели в вашем контроллере, а затем событие модели обновит этот экземпляр вашим токеном.

В качестве отступления: поскольку токен генерируется случайным образом и, похоже, не полагается на какие-либо другие данные / функции, я не верю, что опускать эту строку стыдно:

'token' = mb_substr(bin2hex(openssl_random_pseudo_bytes(32)),0,8);

В метод create в вашем контроллере. Исходя из того, что вы предоставили, это будет самый простой способ решить, что вам нужно.

1 голос
/ 09 мая 2019

Проблема в том, что ваш конструктор не имеет правильной сигнатуры метода.

Метод create в модели laravel создает новую модель: $model = new static($attributes); Массив $attributes - это то, что устанавливает данныена вашей свежей модели.Вы должны убедиться, что ваш конструктор принимает аргумент атрибутов и передает его родителю:

public function __construct(array $attributes = [])
{
    parent::__construct($attributes);
    $this->token = mb_substr(bin2hex(openssl_random_pseudo_bytes(32)),0,8);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...