我尝试创建表格,其中有一个主键作为UUID,并定义为binary(16)
,而不是默认的自增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;");
然而,我在让这个模型工作方面遇到了困难。我已经按照这里提供的教程进行操作。我的模型定义如下:
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:
我发现当创建UuidModel
的实例时,static::creating
事件从未被调用。
我尝试在AppServiceProvider
中设置creating
事件监听器,但也没有被调用。有趣的是,对于常规的Laravel生成的模型User
,creating
事件也不会被调用。
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(){}
}