我在我的表中使用 UUID 作为 PK。它们存储在BINARY(16)
MySQL 列中。我发现它们被映射为string
输入 YII。不过,我生成的 CRUD 代码会发生故障,因为这些二进制列类型是在视图中进行 HTML 编码的。例子:
<?php echo
CHtml::link(CHtml::encode($data->usr_uuid), /* This is my binary uuid field */
array('view', 'id'=>$data->usr_uuid)); ?>
为了解决这个问题,我afterFind()
在beforeSave()
我的模型中分别使用bin2hex
and将值转换为/从十六进制转换hex2bin
。有关更多详细信息,请参阅此内容。
这可以解决视图问题。
但是,现在在访问表单的 url 时搜索 PK:
http://myhost.com/mysite/user/ec12ef8ebf90460487abd77b3f534404
导致User::loadModel($id)
被调用,而后者又调用:
User::model()->findByPk($id);
这不起作用,因为正在生成 SQL(因为它被映射到 phpstring
类型)是
select ... where usr_uuid='EC12EF8EBF90460487ABD77B3F534404'
如果可以的话,会发生什么,因为这些 uuid 字段将条件更改为:
select ... where usr_uuid=unhex('EC12EF8EBF90460487ABD77B3F534404')
我想知道我如何干净地处理这个问题。我看到了一种可能性 - 扩展CMysqlColumnSchema
和覆盖特殊情况的必要方法并将 binary(16) 列作为 uuid 类型处理。
这看起来并不整洁,因为uuid
在 php(它被视为字符串)或 mysql(我将它作为 binary(16) 列)中不支持本机。
有人有什么建议吗?