Как сохранить значение как целое число в Laravel - PullRequest
0 голосов
/ 05 мая 2020

Я разрабатываю блог, используя Laravel, и пытаюсь использовать пакет BenSampo Enum. Кажется, все работает при сохранении сообщения в блоге, но проблема возникает при преобразовании поля post_status как целого числа. Он приводится как строка, хотя я специально установил приведение модели как целое число. Поэтому вместо этого я получаю следующий результат:

Невозможно создать экземпляр PostStatusEnum, используя значение (строка) 1. Возможные значения: [0, 1, 2, 3, 4].

Я провел довольно много онлайн-исследований и нашел черту, которая гарантированно возвращает приведение в виде целого числа. Я изменил его для этой цели, и он действительно работает так, как задумано, но он сталкивается с чертой BenSampo \ Enum \ Traits \ CastsEnums.

При создании сообщения я прикрепляю статус через наблюдателя на основе определенного условие, оно не проходит через форму, поэтому я не могу его проверить (по крайней мере, пока не нашел способа). Я в основном хочу сделать $ post_status = $ post-> post_status на контроллере и получить тот, который был сохранен (или какой бы ни была модель в данный момент). Итак, вместо того, чтобы пытаться взломать этот пакет, я сейчас пытаюсь создать мутатор, чтобы гарантировать, что поле post_status будет сохранено как целое число для начала, но у меня также возникают некоторые трудности с этим. Код ниже, похоже, ничего не делает, что мне не хватает?

public function setPostStatusAttribute($value)
    {
       $this->attributes['post_status'] = integer($value);
    }

Для справки, это то, что у меня есть в модели и миграции, также импортированы необходимые пространства имен:

protected $enumCasts = [

     'post_status' => PostStatusEnum::class,
 ];

protected $casts = [
   'post_status' => 'int', // I've also tried integer. Have also tried putting it above the 
$enumCasts
 ];

//migration 
$table->unsignedInteger('post_status'); //have also tried integer and tinyInteger.

Я также пробовал пакет Spat ie Enums с расширением Laravel, который возвращает значение как целое число, но также столкнулся с проблемами при попытке отобразить поле в методе show.

1 Ответ

1 голос
/ 05 мая 2020
$this->attributes['post_status'] = integer($value);

Я не знаю, должно ли это работать, насколько мне известно, помощника integer(...) нет.

Попробуйте вместо этого приведение:

$this->attributes['post_status'] = (int) $value;

Я не использовал первый пакет, который вы упомянули, но spatie / laravel -enum да. В этом пакете (который, в свою очередь, использует spatie / enum внизу) вы можете просто сделать это:

# Post.php

protected $enums = [
    'post_status' => PostStatusEnum::class,
    'another_field'   => AnotherFieldEnum::class . ':nullable', 
    //    the last bit is to accept nullable values ^^^^^^^^^
];

В случае, если вы хотите использовать аксессоры:

public function getPostStatusAttribute($postStatus)
{
    return PostStatusEnum::make($postStatus);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...