php - Laravel Eloquent 关系中的错误 :: 以 uids 作为主键
问题描述
我正在尝试在我的项目中使用与 '::with' 的关系,但出现了一个奇怪的错误。
实体是:
- 二进制 -> PK:BinaryUid
- 模板 -> PK:TemplateUid
- TemplateBinary -> PK: TemplateBinaryUid / FK: BinaryUid, TemplateUid
是的,我正在使用 UID,而不是增量 ID。
模型中的关系:
- 二进制:
public function templates() {
return $this->belongsToMany(Template::class,'TemplateBinary','BinaryUid','TemplateUid','BinaryUid','TemplateUid');
}
- 模板:
public function binaries() {
return $this->hasManyThrough(Binary::class,TemplateBinary::class,'TemplateUid','BinaryUid','TemplateUid','BinaryUid');
}
- 模板二进制:
class TemplateBinary extends Pivot {
// Whatever
}
二进制实体中的数据:
"BinaryUid": "0607B8E6-A7AE-EB11-80FB-0050562E716F"
模板实体中的数据:
"TemplateUid": "03D499C4-845C-47D9-A1C9-BBD4DA242B8A"
TemplateBinary 实体中的数据:
"BinaryUid": "0607B8E6-A7AE-EB11-80FB-0050562E716F",
"TemplateUid": "03D499C4-845C-47D9-A1C9-BBD4DA242B8A"
在 BinaryController 我正在做:
Binary::with('templates')->get();
这就是我得到的:
Illuminate\Database\QueryException: SQLSTATE[22018]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]操作数类型冲突: uniqueidentifier is in compatible with smallint (SQL: select [Template]. , [TemplateBinary].[BinaryUid] ] as [pivot_BinaryUid], [TemplateBinary].[TemplateUid] as [pivot_TemplateUid] from [Template] 内部连接 [TemplateBinary] on [Template].[TemplateUid] = [TemplateBinary].[TemplateUid] 其中 [TemplateBinary].[BinaryUid]在 (607)) 文件 C:\inetpub\wwwroot\checklist\vendor\laravel\framework\src\Illuminate\Database\Connection.php 第 678 行*
如您所见,“位置”条件试图与整数进行比较,但我可以确认这不是任何实体的增量 ID。但是,它没有理由与增量 ID 进行比较。我不知道它来自哪里,以及为什么 Eloquent 设置这个条件。我能做些什么?
解决方案
解决了,它与 Uids 被用作键有关。
在每个模型上,我都覆盖了这些变量:
$primaryKey = 'BinaryUid';
$incrementing = false;
$keyType = 'string';
$timestamps = false;
我向那些在 Laravel 中使用 UID 的人推荐这篇文章。
推荐阅读
- node.js - 如何在 JavaScript 中计算 ruby 哈希?
- flutter - 如何防止 Flutter 多次 Tab Reloads
- typescript - B2C 自定义策略的自动化测试
- javascript - 从动态按钮 Javascript 获取测试
- excel - Excel VBA中的正则表达式执行完全匹配
- angular - 身份服务器 4 使用带有纯 js 客户端的 cookie
- sql - 我在 MSSQL 列中找不到将分组中的总和行数据的任何链接?
- c++ - 在 C++ 中使用 int 作为 void 指针
- c - C加密逻辑与java不匹配
- python - 使用函数创建一列,其中变量来自其他列