mysql - cast 属性用于外键查询而不是原生类型
问题描述
我们在我们的 mysql 数据库中使用二进制 UUID,并将它们转换为模型上的字符串。这在 laravel 5.7 中为我们工作得很好,但在 6.x 中却没有按预期工作。
我们可以使用二进制 uuid 创建记录和相关记录。但是,我们无法读取关系,由于转换值与数据库中的内容不匹配,它变为空。
您可以看到post
使用二进制id
和外键创建的记录user_id
[2019-11-27 05:39:57] local.INFO: insert into `posts` (`title`, `user_id`, `id`, `updated_at`, `created_at`) values (?, ?, ?, ?, ?)
[2019-11-27 05:39:57] local.INFO: array (
0 => 'Veniam error quod minima. Error laborum voluptatum sunt exercitationem dolor. Quis qui ipsa occaecati iste minus dolor omnis.',
1 => '=��K�WE3��wQ
��',
2 => '�7n��kLS�T$�L�',
3 => '2019-11-27 05:39:57',
4 => '2019-11-27 05:39:57',
但是,如果您尝试查询关系,例如。$user->posts
的转换值user_id
被使用。
[2019-11-27 05:39:57] local.INFO: select * from `posts` where `posts`.`user_id` = ? and `posts`.`user_id` is not null
[2019-11-27 05:39:57] local.INFO: array (
0 => '3d93a84b-fb57-4533-96ab-1c77510ab4e0',
)
因此没有找到任何记录。
这是 laravel 中的错误,它应该使用本机类型进行选择查询而不是强制转换值,不是吗?
模型上的方法本质上是:
铸件
protected function castAttribute($key, $value)
{
if (in_array($key, $this->uuidColumns()) && !empty($value)) {
return $this->resolveUuid()->fromBytes($value)->toString();
}
return parent::castAttribute($key, $value);
}
以及在创建模型时创建 UUID 的引导方法。
public static function bootGeneratesUuid(): void
{
static::creating(function ($model) {
/* @var \Illuminate\Database\Eloquent\Model|static $model */
$uuid = $model->resolveUuid();
foreach ($model->uuidColumns() as $item) {
if (isset($model->attributes[$item]) && !is_null($model->attributes[$item])) {
/* @var \Ramsey\Uuid\Uuid $uuid */
$uuid = $uuid->fromString(strtolower($model->attributes[$item]));
}
$model->attributes[$item] = $model->hasCast($item, 'uuid') ? $uuid->getBytes() : $uuid->toString();
}
});
}
我在这里做了详细的复制 https://github.com/edeis53/laravel6-uuid-issue/blob/master/README.md
解决方案
推荐阅读
- python - 在热图上绘制空间数据
- url - `url_serde` 要求不相关的特征界限
- python - 在 cv2.remap 前后查找单个点的对应像素坐标
- javascript - Monoid 图和“恒等态射是唯一的”
- git - 为什么我会收到“不推荐使用 git lfs clone”的警告?
- javascript - 如何使用 Angular 将第一个表的数据复制到第二个表?
- android - 如何将 tawk.to UI 合并到聊天应用程序中?
- python - 如何在 Python 中使用 AJAX 在按钮单击时显示/获取数据 - AJAX
- python - Python循环替换字符串的一部分
- php - 无法使用 ajax laravel 将数据插入数据库