Php Laravel还原回已删除的记录

Php Laravel还原回已删除的记录,php,laravel,laravel-4,eloquent,Php,Laravel,Laravel 4,Eloquent,我正在尝试实现一个队列,该队列将系统还原回一条已删除的记录。现在,我的代码正常工作,但记录在删除后不会恢复 public function delete_invoice($job, $data) { Debugbar::info("invoiceSale"); try { return DB::transaction(function ()use ($job,$data) { }); } c

我正在尝试实现一个队列,该队列将系统还原回一条已删除的记录。现在,我的代码正常工作,但记录在删除后不会恢复

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
}
公共函数销毁($id,$message='')
{
调试栏::信息(“确定”);
队列::推送('IQueue@delete_invoice', [
'id'=>$id,
'Class'=>$this->Class,
]);

returnparent::destroy($id,trans($this->class.invoice));您可以使用以下代码,希望它能帮助您

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');
}
公共功能销毁(Trip$Trip)
{
$trip->delete();
flash()->警告('Trip'.$Trip->id.'successfully deleted!');
返回重定向(“trips”);
}
公共功能还原(请求$Request)
{
$trip=trip::withTrashed()->where('id',$request['id')->restore();
返回重定向(“trips”);
}

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

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');
}
公共功能销毁(Trip$Trip)
{
$trip->delete();
flash()->警告('Trip'.$Trip->id.'successfully deleted!');
返回重定向(“trips”);
}
公共功能还原(请求$Request)
{
$trip=trip::withTrashed()->where('id',$request['id')->restore();
返回重定向(“trips”);
}

我假设您的代码在其他地方删除了记录,并且您在这里展示的代码应该基于通过
$data
数组传递的模型类和记录id恢复该记录,作为
['class'=>,'id'=>…]

那么您的事务打算做什么?是否有您没有粘贴的代码?否则,不会调用catch,因为不会引发异常,因此不会执行您的代码


因此,只需删除try-and-catch。

我假设您的代码在其他地方删除了该记录,并且您在这里展示的代码应该根据通过
$data
数组传递的模型类和记录id还原该记录,如
['class'=>,'id'=>…]

那么您的事务打算做什么?是否有您没有粘贴的代码?否则,不会调用catch,因为不会引发异常,因此不会执行您的代码


因此,只需删除try-and-catch。

警告:我希望您能够100%控制
$data
中的内容,因为您正在使用
extract()
(特别是使用默认标志)。是否有关于Laravel 4.2的
extract()
的示例或文档?我不确定是否能够100%控制内容。
extract()
是一个核心PHP函数,与Laravel无关。该函数不应用于您无法100%控制(您创建了它)的数据,即使如此,如果您不小心,它也可能导致副作用。只需像这样访问数据:
$data['id']
相反。在此上下文中不需要使用该函数。实际上,我使用
extract()
函数删除
中的其他数据,尝试
,没有任何问题。我认为您不理解
extract()
的问题。如果您没有100%的控制权,并且存在
$data['foo']
在数组中,并且在extract()之前定义了一个变量
$foo
,它将用
$data
-数组中的值覆盖已定义的
$foo
变量。警告:我希望您能够100%控制
$data
中的内容,因为您正在使用
extract()
(特别是默认标志)。是否有关于Laravel 4.2的
extract()
的示例或文档?我不确定我是否100%控制了内容。
extract()
是一个核心PHP函数,与Laravel无关。该函数永远不应该用于您无法100%控制的数据(您创建了它)即使这样,如果你不小心,它也会产生副作用。只需访问如下数据:
$data['id']
。在这种情况下不需要使用该函数。实际上,我使用
extract()
函数删除
try
中的其他数据,没有任何问题。我认为你不理解
extract()的问题
。如果您没有100%的控制权,并且数组中有一个
$data['foo']
,并且在提取()之前定义了一个变量
$foo
,它将用
$data
-数组中的值覆盖定义的
$foo
变量。该事务还将执行删除操作,但我进行了验证,如果出现错误,它将捕获。因此,代码将始终捕获,因为我已经让它始终出错以进行测试。在这种情况下,我将验证fy$数据是否如您预期的那样包含“类”和“id”。此外:您是否在模型上使用?控制器的
$this->Class
属性可能不会返回模型的类(我猜是发票).是的…我已经使用了
SoftDeletingTrait
。我发现执行了
restore
函数,然后返回到
destroy
函数,但是
destroy
函数的结尾总是再次删除数据。事务也会执行删除操作,但我进行了验证,如果出现问题,它会捕获g、 因此,代码总是会被捕获,因为出于测试目的,我已经让它总是出错。在这种情况下,我将验证$data是否如您所期望的那样包含“Class”和“id”。此外:您是否在模型上使用了?您的控制器的
$this->Class
属性可能不会返回您模型的类(我猜是发票)是的…我已经使用了
SoftDeletingTrait
。我发现执行了
restore
函数,然后返回到
destroy
函数,但是
destroy
函数的末尾总是再次删除数据。