加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – 奇怪的Laravel错误(从范围加入)Bad ID col

发布时间:2020-12-14 19:38:52 所属栏目:大数据 来源:网络整理
导读:这是错误输出 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:1
这是错误输出

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的类型定义(name,desc,ect)有关.

这是原始错误输出,但最后有一个坏ID,它应该是table1.id而不仅仅是id.不仅如此,连接甚至不应该在更新中.

通常这将是一个快速和简单的解决方案,但它严格雄辩.唯一奇怪的部分是我正在使用范围来应用连接,我相信这是导致这种情况的原因,然而我正在挖掘文档但我还没有找到解决它的方法.

我的范围适用于以下内容:

public function apply(Builder $builder)
{
    $builder->join('table2','table1.type_id','=','table2.id');
}

我想我需要将它包装在某种if语句中,但是文档已经死路一条,没有一个例子使用这样的东西.

任何人有任何想法来解决这个问题?要深入了解源代码,但这总是一种沉闷的体验.

编辑:这里是或多或少来自Eloquent的查询

$model = Model::find($id); 
$model->type_id = 2; 
$model->save();

编辑:

一个有前途的想法是手动将模型的primaryKey设置为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(IlluminateDatabaseEloquentBuilder $query)
{
    $query->where($this->getQualifiedKeyName(),$this->getKeyForSaveQuery());

    return $query;
}

你会好的!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读