Laravel UUID作为主键

4
我正在尝试在 Laravel Model 中将 uuid 设置为主键。我已经通过在模型中设置引导方法来完成此操作,如 此处 所示,因此每次创建和保存模型时都不必手动创建它。我有一个控制器,只需创建模型并将其保存在数据库中。
它在数据库中正确保存,但是当控制器返回 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();
    }
}
2个回答

5
你需要将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';
    }
}

希望这能帮到你。

2

自从Laravel 9版本,你可以使用内置的traits HasUuids 或者 HasUlids 来支持EloquentUUIDULID.

以下是模型类的示例:

use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Model;

class ModelName extends Model
{
    use HasUuids;
    
    // ...
}

1
在 Laravel 9 中,使用内置的 Illuminate\Database\Eloquent\Concerns\HasUuids 在您的模型中也可以工作。 - Hmerman6006

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接