laravel eloquent 的特殊 UUID 主键
Posted
技术标签:
【中文标题】laravel eloquent 的特殊 UUID 主键【英文标题】:Special UUID primary key for laravel eloquent 【发布时间】:2014-08-01 14:28:21 【问题描述】:我有一个用户表,它不使用自动递增主键,而是使用二进制 uuid 主键。我设置了我的自定义模型以与我的表交互但是,我在尝试使用 ::find()
查找记录时遇到了麻烦,因为对于这样的情况,需要使用 HEX()
和 UNHEX()
mysql 函数来搜索这个 uuid .我如何覆盖它并让::find()
中的任何内容被十六进制。模型名称为 Player。
因此,如果我要尝试查找 uuid 为 9d823b9eec224cbea10b69bec2c5adef
的用户,我无法通过以下方式找到他们:
Player::find('9d823b9eec224cbea10b69bec2c5adef')
因为 uuid 需要取消十六进制。
我试过Player::find("UNHEX('9d823b9eec224cbea10b69bec2c5adef')");
,但没有结果。
到目前为止,这是我的模型:
class Player extends Eloquent
protected $table = 'players';
protected $connection = 'game';
protected $primaryKey = 'uuid';
public $incrementing = false;
public $timestamps = false;
uuid 的数据类型是 binary(16)
更新
我已经使用Player::find(DB::raw("UNHEX('9d823b9eec224cbea10b69bec2c5adef')"));
让它工作,但是每次我需要查找用户时都要写很多。
有什么方法可以让::find()
的参数始终通过DB::raw("UNHEX('uuid')")
运行或通过函数hex2bin()
传递?
我 100% 确定我将始终使用 UUID,因此我想覆盖 ::find()
,而不是创建新方法。
【问题讨论】:
如果你不介意,你能告诉我如何在 laravel 5 中实现 'uuid' 作为主键。我在做同样的事情时遇到了一些麻烦。我在这个帖子中阐明了我的问题:***.com/questions/31817067/… 使用my traits on github。 【参考方案1】:在将它传递给 mysql 之前,我会尝试在 php 中解开它:
Player::find(hex2bin('9d823b9eec224cbea10b69bec2c5adef'));
您可以将此方法添加到您的 Player
类中:
public static function findUUID($uuid)
return self::find(hex2bin($uuid));
现在,您可以在项目中的任何位置这样称呼它:
$result = Player::findUUID('9d823b9eec224cbea10b69bec2c5adef');
如果您不想静态声明它,您可以:
public function findUUID($uuid)
return self::find(hex2bin($uuid));
然后在你的代码中引用它:
$result = new Player;
$result->findUUID('9d823b9eec224cbea10b69bec2c5adef');
【讨论】:
为什么不在模型中创建自己的 find() 方法?我会避免使用 whereRaw,因为当你使用它时你会失去 Eloquent 的所有好处。 我对雄辩的 ORM 很陌生,我现在正在尝试。你能给我举个例子吗? 是的,这是使用 find() Eloquent 方法,所以它的行为是一样的。我刚刚更新了帖子,向您展示了在没有静态声明的情况下执行此操作。 伙计,一定有人真的讨厌所有这些答案。感谢这个工作,它必须是静态的,因为创建模型的新实例意味着我正在创建一个新行。 调用类的新实例不会在数据库中插入新行,除非最后使用 save() 方法。它只是创建一个新对象并且是完全安全的:)【参考方案2】:这应该允许您覆盖本机 find() 行为,而不必使用 findUUID():
protected $primaryKey = 'uuid';
public static function find($uuid)
return parent::find(hex2bin($uuid));
【讨论】:
【参考方案3】:如果你真的想要这样,你也可以这样做Player::find('9d823b9eec224cbea10b69bec2c5adef')
class Player extends Eloquent
protected $table = 'players';
protected $connection = 'game';
protected $primaryKey = 'uuid';
public $incrementing = false;
public $timestamps = false;
public static function find($uuid, $columns = array('*'))
return self::find("UNHEX('$uuid')", $columns);
已编辑
按照用户 Elliot Fehr 的建议添加了自己
【讨论】:
"声明 Player::find() 应该兼容 Illuminate\Database\Eloquent\Model::find($id, $columns = Array)" 将 $columns 参数添加为数组,现在我已经“达到了 '100' 的最大函数嵌套级别,正在中止!” 我应该提到我已经尝试过的所有事情。我已经尝试了所有这些并得到了这些错误。 如果我做不到,我会坚持在 ::find 中手动使用 UNHEX以上是关于laravel eloquent 的特殊 UUID 主键的主要内容,如果未能解决你的问题,请参考以下文章
在 Laravel Eloquent 模型中使用特殊的联合函数
Laravel 5.8 错误 SQLSTATE[HY000]: 一般错误: 1005 uuid
php Laravel 5 Eloquent CheatSheet #laravel #eloquent