【问题标题】:How to delete data in 3 relation table in laravel 5.7如何在laravel 5.7中删除3个关系表中的数据
【发布时间】:2019-01-29 06:20:13
【问题描述】:

我正在尝试使用 laravel 5.7 删除 3 个关系表上的数据,当我在 2 个关系表上尝试它时,它运行良好,但是当我在 3 个关系表中尝试它时,它不起作用。

这是我的桌子的样子:

表 1:group_access

|----|------------| |编号 |组名 | |----|------------| | 67 |测试 | |----|------------|

表 2:fa_group_access

|----|-----------------|--------| |编号 | group_access_id |姓名 | |----|-----------------|--------| | 1 | 67 |约翰 | |----|-----------------|--------|

表 3:survey_group_access

|----|-----------------|----------------| |编号 | group_access_id |代码调查 | |----|-----------------|----------------| | 1 | 67 | SF-001 | |----|-----------------|----------------|

这是我在控制器中删除数据的功能:

public function destroy($id)
{
    $group = Groups::findOrFail($id);

    if($group->delete())
    {   
        Survey_group_access::where('group_access_id', $id)->get();
        FA_Group_Access::where('group_access_id', $id)->get();
        return response()->json(['status'=>'success']);    
    }   
}

我得到一个像这样的错误 sql:

SQLSTATE[23000]:[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]DELETE 语句与 REFERENCE 约束冲突 “survey_group_access_group_access_id_foreign”。发生了冲突 在数据库“aetra2”,表“dbo.survey_group_access”,列 'group_access_id'。 (SQL:从 [group_access] 中删除 [id] = 67)

如何解决这个错误?

【问题讨论】:

  • 显示这 3 个表的迁移文件
  • 从 table1 中删除数据时,您是否要从 table2 和 table 3 中删除数据?这可以通过删除时的级联来实现。
  • @InzamamIdrees 我在帖子中更新了我的模型
  • @SarojShrestha 是的,我想从表 1 中删除数据,表 2 和表 3 将使用表 1 中的参考 ID 自动删除
  • 您只需添加 foriegn key with cascade on delete,然后只需删除 group_access 行,它会自动删除其他不同表上的相关记录。

标签: php sql-server laravel laravel-5


【解决方案1】:

在 group_access 模型中定义关系

public function fa_group_access()
{
return $this->hasMany('fa_group_access');
}

public function survey_group_access()
{
return $this->hasMany('survey_group_access');
}

删除记录及相关:

$group_access = Group_access::find($id);

// delete related   
$group_access->fa_group_access()->delete();
$group_access->survey_group_access()->delete();

$group_access->delete();

我没有测试代码可能有语法错误但应该是 像这样的东西。

我希望这会有所帮助

【讨论】:

  • 没问题的兄弟@RahmatEffendi
【解决方案2】:

这感觉像是Model Events 的一个很好的用例。我这样做的方式如下:

<?php 
namespace App\Models\Administrator;
use Illuminate\Database\Eloquent\Model;
use App\Models\Administrator\Users;

class Groups extends Model
{
    protected $table = 'group_access';

    public static function boot() {
        parent::boot();

        static::deleting(function($groups) { 
            $groups->survey_group_access()->delete();
            $survey_group_access->users()->delete(); 
        });
    }

    public function fa_group_access()
    {
        return $this->hasMany(FA_Group_Access::class,'group_access_id','id');
    }

    public function survey_group_access()
    {
        return $this->hasMany(Survey_group_access::class,'group_access_id','id');
    }
}

.. 你的控制器方法就是:

public function destroy($id)
{
    $group = Groups::findOrFail($id);

    if($group->delete()) {  
        return response()->json(['status'=>'success']);    
    }   
}

【讨论】:

    【解决方案3】:

    您可以使用删除时的级联来执行此操作。你可以参考这里https://laravel.com/docs/5.7/migrations#foreign-key-constraints

    您可以更新迁移:(虽然我的类名只是假设,但您可以理解,我也假设您是从迁移而不是从 phpMyAdmin 创建数据库)

    类 FAGroupAccessTable

    public function up()
        {
            Schema::create('fa_gropu_access', function (Blueprint $table) {
                $table->increments('id');
                $table->integer('group_access_id')->unsigned()->index();
                $table->string('name');
                $table->foreign('group_access_id ')->references('id')->on('group_access')->onDelete('cascade');
            });
        }
    

    SurveyAccessGroup

    public function up()
        {
            Schema::create('survey_access_group', function (Blueprint $table) {
                $table->increments('id');
                $table->integer('group_access_id ')->unsigned()->index();
                $table->string('code_survey');
                $table->foreign('group_access_id ')->references('id')->on('group_access')->onDelete('cascade');
            });
        }
    

    执行此操作后,每当您尝试使用$group_access-&gt;delete(); 删除时,这两个相关数据都会自行删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 2021-07-27
      • 2017-07-09
      • 1970-01-01
      • 2020-03-11
      • 2019-07-13
      相关资源
      最近更新 更多