laravel uuid 作为主键
lararvel uuid as primary key
我正在尝试将 uuid 设置为 Laravel 模型中的主键。我已经在我的模型中设置了一个启动方法,如 stablished here 这样我就不必在每次要创建和保存模型时都手动创建它。我有一个控制器,它只创建模型并将其保存在数据库中。
它正确保存在数据库中,但是当控制器 returns 时,id 的值总是 return 与 0
编辑。我怎样才能使它实际 return 它在数据库中创建的值?
型号
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();
}
}
您需要将 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';
}
}
希望对您有所帮助。
已接受的答案在 Laravel 9 上对我不起作用,但这种方式对我来说效果很好,你可以试试:
1- 在项目路径 app/Traits/IdAsUuidTrait.php
中创建新特征 Class(如果您没有找到 Traits
文件夹,请创建它,这是此 Class 的完整代码:
<?php
namespace App\Traits;
use Illuminate\Support\Str;
trait IdAsUuidTrait
{
public function initializeIdAsUuidTrait(): void
{
$this->keyType = 'string';
$this->id = Str::orderedUuid()->toString();
}
}
2- 在任何模型中,您想要将 id 设为 UUID,只需像这样调用 trait:
use App\Traits\IdAsUuidTrait;
class YourModelName extends Model
{
use IdAsUuidTrait;
...
就是这样,现在尝试创建,select,用这个模型更新数据库中的任何行...
我正在尝试将 uuid 设置为 Laravel 模型中的主键。我已经在我的模型中设置了一个启动方法,如 stablished here 这样我就不必在每次要创建和保存模型时都手动创建它。我有一个控制器,它只创建模型并将其保存在数据库中。
它正确保存在数据库中,但是当控制器 returns 时,id 的值总是 return 与 0
编辑。我怎样才能使它实际 return 它在数据库中创建的值?
型号
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();
}
}
您需要将 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';
}
}
希望对您有所帮助。
已接受的答案在 Laravel 9 上对我不起作用,但这种方式对我来说效果很好,你可以试试:
1- 在项目路径 app/Traits/IdAsUuidTrait.php
中创建新特征 Class(如果您没有找到 Traits
文件夹,请创建它,这是此 Class 的完整代码:
<?php
namespace App\Traits;
use Illuminate\Support\Str;
trait IdAsUuidTrait
{
public function initializeIdAsUuidTrait(): void
{
$this->keyType = 'string';
$this->id = Str::orderedUuid()->toString();
}
}
2- 在任何模型中,您想要将 id 设为 UUID,只需像这样调用 trait:
use App\Traits\IdAsUuidTrait;
class YourModelName extends Model
{
use IdAsUuidTrait;
...
就是这样,现在尝试创建,select,用这个模型更新数据库中的任何行...