【发布时间】:2015-10-27 07:37:30
【问题描述】:
我正在尝试创建具有主键的表,该主键是定义为 binary(16) 的 UUID,而不是默认的自动递增 id 字段。
我已经设法使用原始 SQL 语句创建迁移,尽管 DB::statement 像这样:
DB::statement("CREATE TABLE `binary_primary_keys` (
`uuid` binary(16) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;");
但是,我无法让模型正常工作。我遵循了可用的教程here。我已经这样定义了我的模型:
class UuidModel extends Model
{
public $incrementing = false;
public $primaryKey = 'uuid';
/**
* The "booting" method of the model.
*
* @return void
*/
protected static function boot()
{
parent::boot();
/**
* Attach to the 'creating' Model Event to provide a UUID
* for the `id` field (provided by $model->getKeyName())
*/
static::creating(function ($model) {
$model->{$model->getKeyName()} = (string)$model->generateNewId();
echo($model->{$model->getKeyName()});
});
}
/**
* Get a new version 4 (random) UUID.
*/
public function generateNewId()
{
return Uuid::generate();
}
}
其中Uuid 是Webpatser\Uuid 的别名。
我遇到的一个问题是我无法按照教程中的说明从Eloquent 派生UuidModel。事实上,我没有看到 Eloquent 类。我是从Model 派生的。我猜这个教程是用 Laravel 4 写的。
如果在 Laravel 5 中实现以 UUID 作为主键的表,我将不胜感激。
编辑 1: 所以,如果我这样定义我的类:
use Illuminate\Database\Eloquent
class UuidModel extends Eloquent { ... }
我收到以下错误:
PHP Fatal error: Class 'Illuminate\Database\Eloquent' not found in /home/vagrant/transactly/app/UuidModel.php on line 8
如果我删除 use Illuminate\Database\Eloquent 行,我会收到以下错误:
PHP Fatal error: Class 'App\Eloquent' not found in /home/vagrant/transactly/app/UuidModel.php on line 8
编辑 2:
我发现 static::creating 事件在创建 UuidModel 的实例时不会被调用。
我尝试在AppServiceProvider 中设置creating 事件侦听器,但也没有被调用。有趣的是,creating 事件也不会被 Laravel 生成的常规模型 User 调用。
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
/**
* Attach to the 'creating' Model Event to provide a UUID
* for the `id` field (provided by $model->getKeyName())
*/
echo "Booting...\n";
UuidModel::creating(function ($model) {
echo "Creating Uuid Model...\n";
$model->{$model->getKeyName()} = (string)$model->generateNewId();
});
User::creating(function($user){
echo "Creating User Model...";
$user->name = 'Forced Name in boot()';
});
}
public function register(){}
}
【问题讨论】:
-
你试过 id 和 char(36) 吗?
-
不,我没有。我想 char(36) 的效率会更低。
-
我真的不知道,但我认为比较二进制文件在比较中没有相同的精度,如果你使用,你应该转换成二进制,对吧?这篇文章可能会有所帮助kccoder.com/mysql/uuid-vs-int-insert-performance
-
我认为,在位级别,binary(16) 只是一个数字,仅比常规 int(4) 大四倍。整数比较总是比 char(36) 比较快。您指出的文章证明 char 比较很慢。如果我冒险猜测,我会说作者看到了放缓,因为他使用 char(36) 列作为 pk 而不是 binary(16)。
-
所以你是说你得到一个错误,
Eloquent类没有找到?如果是这样,请发布您遇到的确切错误。
标签: php mysql laravel laravel-5 eloquent