使用eloquent更新时,updated_at列不明确

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用eloquent更新时,updated_at列不明确相关的知识,希望对你有一定的参考价值。

我有3个餐桌推车,药房和cart_pharmacies

购物车表

cart_id | user_id | total_price | status | created_at | updated_at

药房餐桌

pharmacy_id | name | address_id | created_at | updated_at

cart_pharmacies表

cart_pharmacies_id | cart_id | pharmacy_id | created_at | updated_at

在购物车模式中,我定义了关系

   public function pharmacy()
    {
        return $this->belongsToMany('AppPharmacy','cart_pharmacies','cart_id','pharmacy_id');
    }

在药房模型我定义

public function cart()
{
    return $this->belongsToMany('AppCart','cart_pharmacies','pharmacy_id','cart_id');
}

在控制器我有pharmacy_id我试图用代码更新购物车状态

$pharmacy_id=$request->input('pharmacy_id');
$pharmacy=  Pharmacy::findOrFail($pharmacy_id);
$pharmacy->cart()->update(['status'=>1]);

但它给了我错误

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 
'updated_at' in field list is ambiguous (SQL: update `cart` inner join 
`cart_pharmacies` on `cart`.`cart_id` = `cart_pharmacies`.`cart_id` set 
`status` = 1, 
`updated_at` = 2016-05-31 07:14:47 where `cart_pharmacies`.`pharmacy_id` = 5)
答案

SQL查询错误说有多个名为'updated_at'的列(主表和相关表)并且无法决定要更新哪些列。这是一个错误,我认为没有办法用eloquent来解决,因为在没有指定表名的情况下会自动添加updated_at。

另一答案

如果您使用模态,请使用此行更新您的模态

public $timestamps = false;

尝试,它可能会有所帮助

另一答案

您正在使用数据透视表中的时间戳,该时间戳可由Eloquent使用withTimestamps()方法自动控制。

在您的药房模型中:

public function cart(){

return $this->belongsToMany('AppCart','cart_pharmacies','pharmacy_id','cart_id')->withTimestamps();

}

另一答案

到目前为止我找到的唯一解决方案如下:

假设您有一组要更新的值($values)和您的查询($query),您只需创建一个基本查询并手动添加列:

$now = now();

// Manually add the timestamp columns
$values = $values + [
    'table.' . Model::CREATED_AT => $now,
    'table.' . Model::UPDATED_AT => $now,
];

$query->toBase()->update($values);

ModelIlluminateDatabaseEloquentModel的导入,table是你真正想要更新的表的名称。

不是最好但它有效,也许这将成为未来的一个功能......

另一答案

这是克服这个问题的链接

https://github.com/laravel/framework/issues/13909

在更新之前使用toBase()非常有助于解决快乐编码问题。

以上是关于使用eloquent更新时,updated_at列不明确的主要内容,如果未能解决你的问题,请参考以下文章

如何更新 Laravel Eloquent 管理的时间戳(created_at 和 updated_at)的时区?

用户登录时如何更新 updated_at 列?

使用 Eloquent 更新行时数据不持久

Laravel eloquent 使用关系列更新列

Laravel Eloquent 验证插入异常?

Laravel 4.1在进行数据库save()时,会自动多出两个字段updated_at和created_at,如何取消