【问题标题】:How to perform mass delete on Laravel from Vue?如何从 Vue 对 Laravel 执行批量删除?
【发布时间】:2020-01-08 17:24:27
【问题描述】:

我正在尝试为网站制作大量删除功能,以同时删除产品列表。我通过excel插入数据。

控制器功能

public function destroy(Request $request)
{
    ini_set('max_execution_time', 300);
    $products = $request->all();

    try {
        DB::beginTransaction();
        foreach ($products as $product) {
            $dbProduct = $this->getProduct($product['SKU']);
            Log::error($dbProduct);
            $dbProduct->delete();
        }
        DB::commit();
    } catch (Exception $e) {
        DB::rollBack();
        throw new HttpException(500, 'Sucedio un error eliminando la información favor intentar de nuevo');
    }
}

private function getProduct($sku)
{
    $product = Product::where('sku', $sku)->first();
    return $product;
}

我不确定如何在 vue 部分执行 @click 方法,现在我有这个,但这是用于在其他页面上上传,不知道要更改什么以使其删除。它正在接收已分成 50 个一组的数组,即(数据,索引)。

sendData(data, index) {
  this.loading = true;
  this.error = {};
  this.$http.post(this.baseUrl, data, this.params).then(
    () => {
      this.successAction();
      this.statuses[index] = 1;
      this.errorDis = false;
    },
    res => {
      this.showErrors(res);
      this.statuses[index] = 2;
      this.errorDis = true;
    }
  );
}

目前我获得了成功状态,但它没有删除产品

【问题讨论】:

    标签: php laravel vue.js


    【解决方案1】:

    恕我直言,您可以使用一个查询而不是 $products->count() * 2 查询来删除所有产品,类似这样:

    public function destroy(Request $request)
    {
        //ini_set('max_execution_time', 300); no need IMHO
        $products = collect($request->all());
        $skus = $products->pluck('SKU');
    
        try {
            DB::beginTransaction();
            Product::whereIn('sku', $skus)->delete();
            DB::commit();
        } catch (Exception $e) {
            DB::rollBack();
            throw new HttpException(500, 'Sucedio un error eliminando la información favor intentar de nuevo');
        }
        // it's better to return something here
        return response('Finished!', 200);
    }
    

    更新: 正如@ceejayoz 所指出的,上面的函数绕过个别雄辩事件deletingdeleted,如果你需要它们,或者你需要单个Product 模型,这里是一个执行$products->count() + 1 查询的较少剥离 版本:

    public function destroy(Request $request)
    {
        //ini_set('max_execution_time', 300); probably unneeded
        $skus = collect( $request->all() )->pluck('SKU');
        $products = Product::whereIn('sku', $skus)->get();
        try {
            DB::beginTransaction();
            foreach ($products as $product) {
                Log::error($product);
                $product->delete();
            }
            DB::commit();
        } catch (Exception $e) {
            DB::rollBack();
            throw new HttpException(500, 'Sucedio un error eliminando la información favor intentar de nuevo');
        }
        // it's better to return something here
        return response('Finished!', 200);
    }
    

    【讨论】:

    • 请注意:这样做会绕过各个模型 IIRC 上的 Eloquent 事件。对于大多数应用程序来说没什么大不了的,但是如果您依赖它们,则需要注意一些事情。
    • 感谢@ceejayoz 的观点,可能是我把原始逻辑简单化了太多,我会添加一个更有特色的控制器版本。
    • @dparoli 我试过了,但仍然没有删除,我的 vue 组件上的代码对吗?我获得了成功状态,但它没有删除任何内容?
    • 也许你没有发送正确的数据,你应该通过记录或回显来调试 vue 请求数据。但是我不是vuejs的专家,我只能在后端提供帮助。
    • @dparoli 我发送的唯一数据是产品独特 sku 的数组
    猜你喜欢
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2019-04-18
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多