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','TemplateUid');
}
  • 模板:
public function binaries() {
    return $this->hasManyThrough(Binary::class,TemplateBinary::class,'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 与 smallint 不兼容(sql:选择 [Template]。,[TemplateBinary].[BinaryUid] as [pivot_BinaryUid],[TemplateBinary].[TemplateUid] as [pivot_TemplateUid] from [Template] 内连接 [TemplateBinary] on [Template].[TemplateUid] = [TemplateBinary].[ TemplateUid] where [TemplateBinary].[BinaryUid] in (607)) in file C:\inetpub\wwwroot\checklist\vendor\laravel\framework\src\Illuminate\Database\Connection.PHP on line 678*

如您所见,“where”条件试图与整数进行比较,但我可以确认这不是任何实体的增量 ID。不过,它没有理由与增量 ID 进行比较。我不知道它来自哪里,以及为什么 Eloquent 设置这个条件。我能做什么?

解决方法

解决了,这与 Uid 被用作键有关。

在每个模型上,我都覆盖了这些变量:

$primaryKey = 'BinaryUid';
$incrementing = false;
$keyType = 'string';
$timestamps = false;

我向那些在 Laravel 中使用 UID 的人推荐 this post

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...