Lararvel UUID в качестве первичного ключа - PullRequest
2 голосов
/ 15 апреля 2020

Я пытаюсь установить uuid в качестве первичного ключа в Laravel модели. Я сделал это, установив метод загрузки в моей модели как стабильный здесь , поэтому мне не нужно создавать его вручную каждый раз, когда я хочу создать и сохранить модель. У меня есть контроллер, который просто создает модель и сохраняет ее в базе данных.

Он правильно сохраняется в базе данных, но когда контроллер возвращает значение id, всегда возвращается 0. Как я могу сделать так, чтобы он действительно возвращал значение, которое он создает в базе данных?

Модель

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

    protected $casts = [
        'id' => 'string'
    ];

    /**
     *  Setup model event hooks
     */
    public static function boot()
    {
        parent::boot();
        self::creating(function ($model) {
            $uuid = Uuid::uuid4();
            $model->id = $uuid->toString();
        });
    }
}

Контроллер

class UserPersonaController extends Controller
{
    public function new(Request $request)
    {
        return UserPersona::create();
    }
}

1 Ответ

2 голосов
/ 15 апреля 2020

Вам необходимо изменить keyType на string и incrementing на false. Поскольку он не увеличивается.

public $incrementing = false;
protected $keyType = 'string';

Кроме того, у меня есть trait, который я просто добавляю к тем моделям, которые имеют UUID-ключи. Что довольно гибко. Это происходит от https://garrettstjohn.com/articles/using-uuid-laravel-eloquent-orm/, и я добавил несколько небольших поправок для проблем, которые я обнаружил при интенсивном его использовании.

use Illuminate\Database\Eloquent\Model;
use Ramsey\Uuid\Uuid;

/**
 * Class Uuid.
 * Manages the usage of creating UUID values for primary keys. Drop into your models as
 * per normal to use this functionality. Works right out of the box.
 * Taken from: http://garrettstjohn.com/entry/using-uuids-laravel-eloquent-orm/
 */
trait UuidForKey
{

    /**
     * The "booting" method of the model.
     */
    public static function bootUuidForKey()
    {
        static::retrieved(function (Model $model) {
            $model->incrementing = false;  // this is used after instance is loaded from DB
        });

        static::creating(function (Model $model) {
            $model->incrementing = false; // this is used for new instances

            if (empty($model->{$model->getKeyName()})) { // if it's not empty, then we want to use a specific id
                $model->{$model->getKeyName()} = (string)Uuid::uuid4();
            }
        });
    }

    public function initializeUuidForKey()
    {
        $this->keyType = 'string';
    }
}

Надеюсь, это поможет.

...