【问题标题】:Laravel restore back deleted recordLaravel 恢复已删除的记录
【发布时间】:2019-06-18 23:30:22
【问题描述】:

我正在尝试实现系统将恢复到已删除记录的队列。现在我的代码可以正常工作,但删除后记录不会恢复。

public function delete_invoice($job, $data)
    {
        Debugbar::info("invoiceSale");
        try {
            return DB::transaction(function ()use ($job,$data) {

            });
        } catch (TransactionException $e) {
            # reestore function
            extract($data);
            $data = $Class::withTrashed()->find($id);
            $data->restore();
            Debugbar::info($data->toArray());
            return Response::json(['errors' => array_flatten($e->getErrors())], 400);
        }
    }

这是控制器的功能

public function destroy($id, $message = '')
{
    Debugbar::info("ok");
    Queue::push('IQueue@delete_invoice', [
        'id' => $id,
        'Class' => $this->Class,

    ]);

    return parent::destroy($id, trans("$this->class.invoice")); <--delete invoice
}

【问题讨论】:

  • 警告:我希望你能 100% 控制$data 中的内容,因为你使用的是extract()(特别是使用默认标志)。跨度>
  • Laravel 4.2 是否有关于 extract() 的示例或文档?我不确定我是否能 100% 控制内容。
  • extract() 是 PHP 的核心函数,与 Laravel 无关。该功能永远不应该用于您无法 100% 控制的数据(您已经创建了它),即使如此,如果您不小心,它也会导致副作用。只需像这样访问数据:$data['id']。在这种情况下无需使用该功能。 Here's the manual
  • 其实我是用extract()函数把我在try中的其他数据删除没有问题的。
  • 我认为您不理解 extract() 的问题。如果您没有 100% 的控制权并且您的数组中有一个 $data['foo'] 并且您在 extract() 之前定义了一个变量 $foo,它将用 @ 中的值覆盖您定义的 $foo 变量987654336@-数组。 Read the warnings in the manual

标签: php laravel laravel-4 eloquent


【解决方案1】:

您可以使用以下代码,希望对您有所帮助。

public function destroy(Trip $trip)
{
    $trip->delete();
    flash()->warning('Trip '.$trip->id.' successfully deleted! <a href=trips/'.$trip->id.'/restore>UNDO</a>');
    return redirect('trips');
}

public function restore(Request $request) 
{
    $trip = Trip::withTrashed()->where('id', $request['id'])->restore();
    return redirect ('trips');
}

【讨论】:

    【解决方案2】:

    我假设您的代码在其他地方删除了记录,并且您在此处提供的代码应该根据模型类和通过 $data 数组作为 ['Class' =&gt; ..., 'id' =&gt; ...] 传递的记录 ID 来恢复该记录。

    那么您的交易是为了做什么?有没有你没有粘贴的代码?否则 catch 永远不会被调用,因为没有抛出异常,因此你的代码不会被执行。

    所以只需删除 try and catch。

    【讨论】:

    • 事务也将执行删除操作,但我进行了验证,如果出现问题,它将去捕获。因此,代码总是会被捕获,因为我已经让它总是出错以进行测试。
    • 在这种情况下,我会验证 $data 是否包含您所期望的“Class”和“id”。此外:你在你的模型上使用SoftDeletingTrait 吗?
    • 您的控制器的$this-&gt;Class 属性可能不会返回您模型的类(我猜是发票)。
    • 是的...我已经使用SoftDeletingTrait。我发现restore函数被执行然后返回destroy函数但是destroy函数的结尾总是再次删除数据。
    猜你喜欢
    • 2013-02-26
    • 2013-12-05
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    相关资源
    最近更新 更多