Как удалить данные в таблице 3 отношений в Laravel 5.7 - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь удалить данные в таблице 3 отношений, используя laravel 5.7, когда я пытаюсь сделать это в таблице 2 отношений, она работает хорошо, но когда я пытаюсь это сделать в таблице 3 отношений, она не работает.

это моя таблица выглядит так:

таблица 1: group_access

|----|------------|
| id | group_name |
|----|------------|
| 67 |     test   |
|----|------------|

таблица 2: fa_group_access

|----|-----------------|--------|
| id | group_access_id | name   |
|----|-----------------|--------|
|  1 |     67          | john   |
|----|-----------------|--------|

таблица 3: survey_group_access

|----|-----------------|---------------|
| id | group_access_id | code_survey   |
|----|-----------------|---------------|
|  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 11 для 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 ]

0 голосов
/ 29 января 2019

Это похоже на хороший вариант использования для 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']);    
    }   
}
0 голосов
/ 29 января 2019

Вы можете сделать это с помощью каскада при удалении.Вы можете взять ссылку отсюда https://laravel.com/docs/5.7/migrations#foreign-key-constraints.

Вы можете обновить миграции: (Хотя мое имя класса - это только предположения, вы можете понять, также я предполагаю, что вы создаете базу данных из миграции, а не из phpMyAdmin)

class 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->delete(); эти две связанные данные будут удалены самостоятельно.

0 голосов
/ 29 января 2019

Определить отношение в модели 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();

Я не проверяю код, возможно, есть синтаксическая ошибка, но она должнабыть чем-то вроде этого.

Я надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...