Laravel - 更新时禁用更新时间

时间:2015-05-19 07:59:09

标签: php laravel laravel-4 laravel-5

使用laravel 5上的查询构建器获取更新问题。我已尝试禁用updated_at但仍然失败。

这是我的代码:

    $query = StockLog::where('stock_id', $id)->whereBetween('created_at', $from, $to])->update(['batch_id' => $max + 1]);

我尝试了两种方法: 第一个在我的模特我设置:

public function setUpdatedAtAttribute($value)
{
    /*do nothing*/
}

第二个:

$stocklog = new StockLog;
$stocklog->timestamps = false;

$query = $stocklog::where('stock_id', $id)->whereBetween('created_at', [$from, $to])->update([
        'batch_id' => $max + 1]);

他们都失败了。无论如何要禁用updated_at?

提前致谢

5 个答案:

答案 0 :(得分:25)

  

默认情况下,Eloquent会自动维护数据库表中的created_at和updated_at列。只需将这些时间戳列添加到您的表中,Eloquent将负责其余的工作。

我真的不建议删除它们。但是如果你想使用以下方式。

将以下内容添加到模型

public $timestamps = false;

这将禁用时间戳。

编辑:您希望保留created_at字段,可以覆盖模型中的getUpdatedAtColumn

使用以下代码:

public function getUpdatedAtColumn() {
    return null;
}

答案 1 :(得分:8)

在您的模型中,添加此方法:

/**
 * @param  mixed  $value
 * @return $this
 */
public function setUpdatedAt($value)
{
    return $this;
}

更新:在Laravel 5.5中

试着在你的模型中使用它:

const CREATED_AT = null;
const UPDATED_AT = null;

答案 2 :(得分:6)

接受的答案对我没有用,但是让我朝着正确的方向前进:

class Whatever extends Model {
    //...
    const UPDATED_AT=NULL;
    //...

Laravel 5.3

答案 3 :(得分:2)

如果您想永久关闭它,可以使用以下内容。

将以下内容添加到您的模型中......

public $timestamps = false;

如果您想继续使用created_at,请添加以下内容。

    static::creating( function ($model) {
        $model->setCreatedAt($model->freshTimestamp());
    });

或使用以下方式...

/**
 * Set the value of the "updated at" attribute.
 *
 * @param  mixed  $value
 * @return void
 */
public function setUpdatedAt($value)
{
    $this->{static::UPDATED_AT} = $value;
}

答案 4 :(得分:0)

在这种情况下,最好使用 查询构建器 而不是 Eloquent ,因为 查询生成器 并不会隐含地编辑时间戳字段。使用 查询生成器 将具有仅针对相关更新操作而无需更改所有模型的优势。

在一行中你可以做到:

$query = \DB::table('stocklogs')->where('stock_id', $id)->whereBetween('created_at', [$from, $to])->update(['batch_id' => $max + 1]);