laravel雄辩的特殊UUID主键

时间:2014-08-01 14:28:21

标签: php mysql sql laravel

我有一个不使用自动增量主键的用户表,而是使用二进制uuid主键。我设置我的自定义模型以与我的表进行交互,但是,我在使用::find()尝试查找记录时遇到问题,因为对于这样的情况,需要使用HEX()和{来搜索此uuid {1}} mysql函数。如何覆盖它并让UNHEX()中的任何内容被剔除。模型的名称是Player。

因此,如果我试图找到一个uuid为::find()的用户,我无法通过以下方式找到它们:

9d823b9eec224cbea10b69bec2c5adef因为uuid需要不被解雇。

我已经尝试Player::find('9d823b9eec224cbea10b69bec2c5adef')而没有结果。

到目前为止,这是我的模型:

Player::find("UNHEX('9d823b9eec224cbea10b69bec2c5adef')");

uuid的数据类型是binary(16)


更新

我已经通过使用class Player extends Eloquent { protected $table = 'players'; protected $connection = 'game'; protected $primaryKey = 'uuid'; public $incrementing = false; public $timestamps = false; } 来实现它,但是每次我需要查找用户时都需要编写很多东西。

我有什么方法可以让Player::find(DB::raw("UNHEX('9d823b9eec224cbea10b69bec2c5adef')"));的参数始终通过::find()或通过函数DB::raw("UNHEX('uuid')")传递?

我100%确定我将始终使用UUID,因此我想覆盖hex2bin(),而不是创建新方法。

3 个答案:

答案 0 :(得分:5)

在将它传递给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');

答案 1 :(得分:1)

这应该允许您覆盖本机find()行为而不必使用findUUID():

protected $primaryKey = 'uuid';

public static function find($uuid)
{
    return parent::find(hex2bin($uuid));
}

答案 2 :(得分:-1)

如果您真的想要这样,您也可以{/ 1}}使用此

Player::find('9d823b9eec224cbea10b69bec2c5adef')

<强> EDITED

添加了自我,正如用户Elliot Fehr建议的那样