奇怪的 Laravel 错误(从范围加入)错误的 ID 列
Strange Laravel Error (Join from scope) Bad ID col
这是错误输出
SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is
ambiguous
(SQL: update `table1` inner join `table2` on
`table1`.`type_id` = `table2`.`id` set `type_id` = 2,
`updated_at` = 2015-01-09 19:36:16
where `table1`.`site_id` = 1 and `id` = 1)
为了问这个问题,我只编辑了 table 个名字。有问题的查询是在 table 中设置项目的 "type",table1 具有 id,它与 table2 的类型定义有关(名称,描述等)。
这是原始错误输出,但是最后有一个错误的 ID,应该是 table1.id
而不仅仅是 id
。不仅如此,连接甚至不应该在更新中。
通常情况下,这将是一个快速而简单的修复,但它完全是 Eloquent
。唯一奇怪的部分是我正在使用一个范围来应用连接,我相信这是造成这种情况的原因,但是通过挖掘文档我还没有找到修复它的方法。
我的适用范围如下:
public function apply(Builder $builder)
{
$builder->join('table2', 'table1.type_id', '=', 'table2.id');
}
我想我需要用某种 if 语句将它包装起来,但文档是死胡同,none 的示例使用了这样的东西。
有人知道解决这个问题的方法吗?打算深入研究源代码,但这总是一种沉闷的体验。
编辑:这里是或多或少来自 Eloquent
的查询
$model = Model::find($id);
$model->type_id = 2;
$model->save();
编辑:
一个有前途的想法是手动将模型的主键设置为 table1.id
,但是这样做会导致它改为使用 table1.table1.id
。看到我试图只设置 id
但它又回到了不添加 table1
.
的原始问题
在您的模型上覆盖这些:
// if you have timestamps on both tables
const UPDATED_AT = 'table1.updated_at';
const CREATED_AT = 'table1.created_at';
protected function setKeysForSaveQuery(\Illuminate\Database\Eloquent\Builder $query)
{
$query->where($this->getQualifiedKeyName(), '=', $this->getKeyForSaveQuery());
return $query;
}
你会好起来的!
这是错误输出
SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is
ambiguous
(SQL: update `table1` inner join `table2` on
`table1`.`type_id` = `table2`.`id` set `type_id` = 2,
`updated_at` = 2015-01-09 19:36:16
where `table1`.`site_id` = 1 and `id` = 1)
为了问这个问题,我只编辑了 table 个名字。有问题的查询是在 table 中设置项目的 "type",table1 具有 id,它与 table2 的类型定义有关(名称,描述等)。
这是原始错误输出,但是最后有一个错误的 ID,应该是 table1.id
而不仅仅是 id
。不仅如此,连接甚至不应该在更新中。
通常情况下,这将是一个快速而简单的修复,但它完全是 Eloquent
。唯一奇怪的部分是我正在使用一个范围来应用连接,我相信这是造成这种情况的原因,但是通过挖掘文档我还没有找到修复它的方法。
我的适用范围如下:
public function apply(Builder $builder)
{
$builder->join('table2', 'table1.type_id', '=', 'table2.id');
}
我想我需要用某种 if 语句将它包装起来,但文档是死胡同,none 的示例使用了这样的东西。
有人知道解决这个问题的方法吗?打算深入研究源代码,但这总是一种沉闷的体验。
编辑:这里是或多或少来自 Eloquent
的查询$model = Model::find($id);
$model->type_id = 2;
$model->save();
编辑:
一个有前途的想法是手动将模型的主键设置为 table1.id
,但是这样做会导致它改为使用 table1.table1.id
。看到我试图只设置 id
但它又回到了不添加 table1
.
在您的模型上覆盖这些:
// if you have timestamps on both tables
const UPDATED_AT = 'table1.updated_at';
const CREATED_AT = 'table1.created_at';
protected function setKeysForSaveQuery(\Illuminate\Database\Eloquent\Builder $query)
{
$query->where($this->getQualifiedKeyName(), '=', $this->getKeyForSaveQuery());
return $query;
}
你会好起来的!