这是错误输出
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)
在此,我仅出于提出此问题的目的编辑了表名。有问题的查询是设置表中项目的"类型",table1 具有 id,它与 table2 的类型定义(名称、描述等)相关。
这是原始错误输出,但是最后有一个错误的ID,它应该table1.id
而不仅仅是id
。不仅如此,加入甚至不应该在更新中。
通常这将是一个快速简便的修复,但它都是严格Eloquent
。唯一奇怪的部分是我正在使用范围来应用连接,我相信这就是导致这种情况的原因,但是挖掘文档时我还没有看到修复它的方法。
我的范围从以下方面应用:
public function apply(Builder $builder)
{
$builder->join('table2', 'table1.type_id', '=', 'table2.id');
}
我想我需要用某种 if 语句包装它,但文档一直是死胡同,没有一个示例使用这样的东西。
有人对解决这个问题有任何想法吗?深入研究源代码,但这总是一种沉闷的体验。
编辑:这是或多或少来自雄辩的查询
$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;
}
你会很好!