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

Laravel 数据透视表 id 列

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

php Laravel 5 Eloquent CheatSheet #laravel #eloquent