在laravel中删除行时如何更新字段

在laravel中删除行时如何更新字段,laravel,laravel-4,eloquent,Laravel,Laravel 4,Eloquent,让我有一个名为customer的表,其中customer表有一个名为deleted\u by的字段。 我在customer模型中实现softDelete。现在我想在行删除时更新deleted\u by。这样我就可以追踪谁删除了这一行 我在谷歌上搜索过,但什么也没找到 我使用laravel 4.2.8&Elount您可以使用以下内容更新字段: $customer = Customer::find(1); // Assume 1 is the customer id if($customer-&g

让我有一个名为
customer
的表,其中customer表有一个名为
deleted\u by
的字段。 我在
customer
模型中实现
softDelete
。现在我想在行删除时更新
deleted\u by
。这样我就可以追踪谁删除了这一行

我在谷歌上搜索过,但什么也没找到


我使用laravel 4.2.8&Elount

您可以使用以下内容更新字段:

$customer = Customer::find(1); // Assume 1 is the customer id

if($customer->delete()) { // If softdeleted

    DB::table('customer')->where('id', $customer->id)
      ->update(array('deleted_by' => 'SomeNameOrUserID'));
}
此外,您可以在一个查询中执行此操作:

// Assumed you have passed the id to the method in $id
$ts = Carbon\Carbon::now()->toDateTimeString();
$data = array('deleted_at' => $ts, 'deleted_by' => Auth::user()->id);
DB::table('customer')->where('id', $id)->update($data);

这两项都是在一次查询中完成的,
softDelete
,也被记录下来。

类似的方法是:

// override soft deleting trait method on the model, base model 
// or new trait - whatever suits you
protected function runSoftDelete()
{
    $query = $this->newQuery()->where($this->getKeyName(), $this->getKey());

    $this->{$this->getDeletedAtColumn()} = $time = $this->freshTimestamp();

    $deleted_by = (Auth::id()) ?: null;

    $query->update(array(
       $this->getDeletedAtColumn() => $this->fromDateTime($time), 
       'deleted_by' => $deleted_by
    ));
}
那么你所需要的就是:

$someModel->delete();
它已经完成了。

我宁愿用a来做这个

<?php
class Customer extends \Eloquent {
    ...
    public static function boot() {
        parent::boot();

        // We set the deleted_by attribute before deleted event so we doesn't get an error if Customer was deleted by force (without soft delete).
        static::deleting(function($model){
            $model->deleted_by = Auth::user()->id;
            $model->save();
        });
    }
    ...
}

我知道这是一个老问题,但(在客户模型中)您可以做以下几点

public function delete() 
{
    $this->deleted_by = auth()->user()->getKey();
    $this->save();

    return parent::delete();
}

这仍然允许软删除,同时在删除之前设置另一个值。

它可以工作。我接受这个答案。但是我不能投票,因为我的声誉不足以支持你这么多+1,我喜欢这个想法,但我也会传递一个参数,可以选择更新
deleted\u by
字段<如果($deleted_by){…}@WereWolf TheAlpha是的,那也可以。这取决于所需的功能。提供的只是一个如何有效处理它的示例。请注意,如果使用原始特征并创建新特征来覆盖
runSoftDelete()
方法,则此操作无效。它返回时出现了一个致命错误:
Trait方法runSoftDelete尚未应用,因为在XXX
上有与其他Trait方法的冲突,其中
XXX
是您的模型名。@JeremyHarris显然,这就是Trait在PHP中的工作方式。但是救援的别名:)如果你想在新的trait中覆盖该方法,那么只需使用
use SoftDeletes{runSoftDelete as unusedSoftDelete;}
就不会发生冲突。啊哈,非常好。我不知道特征别名。这个软件包可以帮助你
public function delete() 
{
    $this->deleted_by = auth()->user()->getKey();
    $this->save();

    return parent::delete();
}