根据Laravel Vue Js Api中的关系从多个表中删除数据

Posted

技术标签:

【中文标题】根据Laravel Vue Js Api中的关系从多个表中删除数据【英文标题】:Deleteing data from multiple tables depending relationship in Laravel Vuejs Api 【发布时间】:2020-03-11 18:54:52 【问题描述】:

我有两张表 Company 和 Employee

在关系中,Company 是父表,Employees 是子表。

现在我需要从父表中删除记录,而父表又必须删除所有相关的子表。

如何做到这一点?

它给了我以下错误

消息:“模型 [App\Employee] 2 没有查询结果”

模态代码是:

public function up()
    
        Schema::create('employees', function (Blueprint $table) 
            $table->bigIncrements('id');
             $table->string('BadgeCode')->unique();
              $table->integer('company_id');
              $table->timestamps();
        );
    

API 代码是:

Route::apiResources(['company'=>'API\CompanyController']);

CompanyController 中的代码是:

 public function destroy($id)
    
         $this->authorize('isAdmin');
        $user = Company::findOrFail($id);
        Employee::where('company_id',$id)->delete();
        $user->delete();
        return ['message'=>'Company Deleted Successfully'];
    

我的 Company.Vue 脚本代码:

deletecompany(id) 
      if (this.$gate.isAdmin()) 
        swal
          .fire(
            title: "Are you sure?",
            text: "You won't be able to revert this!",
            type: "warning",
            showCancelButton: true,
            confirmButtonColor: "#3085d6",
            cancelButtonColor: "#d33",
            confirmButtonText: "Yes, delete it!"
          )
          .then(result => 
            //Send request to the server

            if (result.value) 
              this.form
                .delete("api/company"/" + id)
                .then(() => 
                  // swal.fire("Deleted!", "Your file has been deleted.", "success");
                  toast.fire(
                    type: "success",
                    title: "Your Selected Company is successfully deleted!"
                  );
                  Fire.$emit("refreshPage");
                )
                .catch(e => 
                  console.log(e);
                );
            
          );
       else 
        toast.fire(
          type: "error",
          title: "You don't permission to perform this action!"
        );
        Fire.$emit("refreshPage");
      
    

html 代码:

<a href="#" v-if="$gate.isAdmin()" @click="deletecompany(company.id)">
                      <i class="fa fa-trash red"></i>
                    </a>

【问题讨论】:

嗯,如果总是这样,为什么在级联上不删除? 或者可能覆盖模型中的删除方法以调用 $this-&gt;employees()-&gt;delete(); 和之后的 parent::delete() 你的意思是这样 $user = Company::findOrFail($id); $用户->删除();员工::where('company_id',$id)->delete(); $this->employees()->delete(); return ['message'=>'公司删除成功']; 您的错误消息通常仅在您执行Employee::findOrFail($id) 时出现。你哪里有这样的电话?我在您的代码中没有看到它。你也有堆栈跟踪吗? 另外一种更简洁的方法是在 laravel 中使用 Observer pattern。这样您就可以从CompanyController 中删除Employee::delete() 调用并将其移动到自己的CompanyObserver::deleted() 函数中。 【参考方案1】:

您应该在迁移中添加company_idonDelete(cascade) 的引用参见此链接What does onDelete('cascade') mean?,当您删除公司时,它会自动删除与该公司关联的所有员工。

public function up() 
    Schema::create('employees', function (Blueprint $table) 
        $table->bigIncrements('id');
        $table->string('BadgeCode')->unique();
        $table->bigInteger('company_id')->unsigned();
        $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
        $table->timestamps();
    );

【讨论】:

这与$this-&gt;authorize('isAdmin');有关,请尝试在您的控制器中删除此行,看看它是否有效。这意味着用户无权删除资源。在尝试删除之前先以管理员身份登录 是的,你是对的,我删除了它,它可以工作了,谢谢

以上是关于根据Laravel Vue Js Api中的关系从多个表中删除数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel API 从 vue js 发送文件数组

在 Vue.js 中使用 axios 向 Laravel API 发送获取请求

Vue.js + REST api 中的身份验证流程

Vue JS 对分页 Laravel 结果的实时客户端搜索过滤器

无法从 Vue.js 中的单个文件组件导入 Mixin

从 Vue JS + Laravel 中的 URL 中删除哈希