更新时不触及时间戳(Laravel)

时间:2013-09-19 21:02:12

标签: php laravel laravel-4 eloquent

是否可以在不触及时间戳的情况下更新用户?

我不想完全禁用时间戳..

grtz

9 个答案:

答案 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等于trueArr::get($options, 'timestamps', true)返回true时才会更新时间戳字段(默认情况下,如果$options数组,则会更新不包含密钥timestamps)。

只要其中一个返回falsetimestamps字段就不会更新。

答案 2 :(得分:13)

加入Antonio Carlos Ribeiro的回答

如果您的代码要求时间戳超过50%的时间取消激活 - 也许您应该禁用自动更新并手动访问它。

在扩展雄辩模型时,您可以通过添加

来禁用时间戳

<强>更新

public $timestamps = false;

在你的模特里面。

答案 3 :(得分:11)

上面的示例很酷,但仅适用于单个对象(每次只有一行)。 如果要更新整个集合,这是如何临时禁用时间戳的简便方法。 class Order extends Model {  ....     公共函数scopeWithoutTimestamps()     {         $ this-&gt; timestamps = false;         返回$ this;     } } 现在你可以简单地调用这样的东西: Order :: withoutTimestamps() - &gt; leftJoin('customer_products','customer_products.order_id','=','orders.order_id') - &gt; update(array('orders.customer_product_id'=&gt; \ DB ::生( 'customer_products.id')));

答案 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