是否可以在不触及时间戳的情况下更新用户?
我不想完全禁用时间戳..
grtz
答案 0 :(得分:117)
暂时禁用它:
$user = User::find(1);
$user->timestamps = false;
$user->age = 72;
$user->save();
您可以选择在保存后重新启用它们。
这是仅限Laravel 4和5的功能,不适用于Laravel 3。
答案 1 :(得分:17)
在Laravel 5.2
中,您可以将公共字段$timestamps
设置为false
,如下所示:
$user->timestamps = false;
$user->name = 'new name';
$user->save();
或者您可以将选项作为save()
函数的参数传递:
$user->name = 'new name';
$user->save(['timestamps' => false]);
为了更深入地了解其工作原理,您可以在方法\Illuminate\Database\Eloquent\Model
中查看课程performUpdate(Builder $query, array $options = [])
:
protected function performUpdate(Builder $query, array $options = [])
// [...]
// First we need to create a fresh query instance and touch the creation and
// update timestamp on the model which are maintained by us for developer
// convenience. Then we will just continue saving the model instances.
if ($this->timestamps && Arr::get($options, 'timestamps', true)) {
$this->updateTimestamps();
}
// [...]
仅当公共属性timestamps
等于true
或Arr::get($options, 'timestamps', true)
返回true
时才会更新时间戳字段(默认情况下,如果$options
数组,则会更新不包含密钥timestamps
)。
只要其中一个返回false
,timestamps
字段就不会更新。
答案 2 :(得分:13)
加入Antonio Carlos Ribeiro的回答
如果您的代码要求时间戳超过50%的时间取消激活 - 也许您应该禁用自动更新并手动访问它。
在扩展雄辩模型时,您可以通过添加
来禁用时间戳<强>更新强>
public $timestamps = false;
在你的模特里面。
答案 3 :(得分:11)
答案 4 :(得分:7)
对于尝试执行Model::update()
来电的Laravel 5.x用户,要使其正常运行,您可以使用
Model::where('example', $data)
->update([
'firstValue' => $newValue,
'updatedAt' => \DB::raw('updatedAt')
]);
由于Model :: update函数不再采用第二个参数。 参考:laravel 5.0 api
经过测试并使用5.2版本。
答案 5 :(得分:3)
我遇到了需要进行涉及连接的批量更新的情况,因此override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent) {
?????
}
// Showing the user location
func showUserLocation(sender : AnyObject) {
let status = CLLocationManager.authorizationStatus()
//Asking for authorization to display current location
if status == CLAuthorizationStatus.NotDetermined {
locationManager.requestWhenInUseAuthorization()
} else {
locationManager.startUpdatingLocation()
}
导致了重复的列冲突。我使用此代码修复它而不需要范围:
updated_at
答案 6 :(得分:3)
如果您需要更新单一模式查询:
$product->timestamps = false;
$product->save();
或
$product->save(['timestamps' => false]);
如果您需要更新多个模型查询,请使用
DB::table('products')->...->update(...)
而不是
Product::...->update(...)
答案 7 :(得分:2)
您也可以使用以下语法:
Model::where('Y', 'X')
->update(['Y' => 'Z'], ['timestamps' => false]);
答案 8 :(得分:-1)
我以自己的方式解决了这个问题,没有使用任何配置(不是最好的方法,但很有帮助):
$time = $user->updated_at; //write a copy of "updated_at" to $time variable
//do anything you want and let timestamp work as normal
$user->update('updated_at'=> $time) //At the end, rewrite the $time to "updated_at"
不要忘记在模型中制作updated_at
fillable
。