Сбой ограничения внешнего ключа в laravel - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь создать записи журнала с внешними ключами guest_id и Department_to_visit

SQL:

DROP TABLE IF EXISTS `logs`;
CREATE TABLE `logs`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `guest_id` int(11) NOT NULL,
  `guest_id_number` int(11) NOT NULL,
  `date_time_in` datetime(0) NOT NULL,
  `date_time_out` datetime(0) NULL DEFAULT NULL,
  `purpose` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `department_to_visit` int(11) NULL DEFAULT NULL,
  `updated_at` timestamp(6) NULL DEFAULT NULL,
  `created_at` timestamp(6) NULL DEFAULT NULL,
  PRIMARY KEY (`id`, `guest_id`) USING BTREE,
  INDEX `fk_logs_guests1_idx`(`guest_id`) USING BTREE,
  INDEX `fk_logs_dept1_idx`(`department_to_visit`) USING BTREE,
  CONSTRAINT `fk_logs_dept1` FOREIGN KEY (`department_to_visit`) REFERENCES `dept` (`dept_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_logs_guests1` FOREIGN KEY (`guest_id`) REFERENCES `guests` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
)

Модель журналов

class Logs extends Model
{
    protected $table = 'logs';
    public function guests()
    {
        return $this->belongsTo('App\Guest','guest_id','id');
    }
    public function departments()
    {
        return $this->belongsTo('App\Department','department_to_visit','dept_id');
    }

Я продолжаю получатьошибка SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: не удается выполнить ограничение внешнего ключа (guest_log. logs, CONSTRAINT fk_logs_dept1 FOREIGN KEY (department_to_visit) ССЫЛКИ dept (dept_id) НА УДАЛИТЬ НЕТ ДЕЙСТВИЙ, ОБНОВЛЕНИЕ НЕТ ДЕЙСТВИЙ) (SQL: вставить в logs (guest_id, guest_id_number, purpose, department_to_visit, date_time_in, updated_at, created_at)значения (4, 2, 2, 1, 2018-12-23 12:53:22, 2018-12-23 12:53:22, 2018-12-23 12:53:22))

всякий раз, когда я пытаюсь создать новую запись в журнале, используя

LogController

<code>  public function store(Request $request)
    {
        $this->validate($request, [
            'guest_id'=>'required',
            'guest_id_number'=>'required',
            'purpose'=>'required',
            'department_to_visit']);
        $logs = new Logs();
        $guest = Guest::findOrFail($request->guest_id);
        $logs->guest_id = $guest->id;
        $logs->guest_id_number = $request->guest_id_number;
        $logs->purpose = $request->purpose;
        echo $request->department_to_visit;
        $department= Department::findOrFail($request->department_to_visit);
//        echo '<pre>',var_dump($department),'
';$ logs-> Department_to_visit = $ Department-> dept_id;$ logs-> date_time_in = Carbon :: now ();$ ЖУРНАЛЫ РЕГИСТРАЦИИ-> Save ();// возврат перенаправления (route ('home'));}

с использованием этого метода

 <div class="container-fluid">
        {!! BootForm::inline(['route'=>['logs.store'],'method'=>'POST']) !!}

        {!! BootForm::select('guest_id', 'Guest Name',\App\Guest::pluck('last_name','id'),null, [])!!}


        {!! BootForm::tel('guest_id_number','ID Number',null, ['required']) !!}
        {!! BootForm::select('department_to_visit','Department to Visit', App\Department::pluck('dept_code','dept_id'),null,[]) !!}
        {!! BootForm::text('purpose',null,null,['required']) !!}

        {!! BootForm::submit('Save') !!}

        {!! BootForm::close() !!}


    </div>

Раньше я получал ошибки на guest_id, но исправлял их.Я думал, что это не будет отличаться с guest_id, но Department_to_visit продолжает получать ошибки.Пожалуйста, помогите мне в решении и понимании причины проблемы

1 Ответ

0 голосов
/ 23 декабря 2018

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

Один из следующих запросовне должно содержать строк:

SELECT * FROM guests WHERE id = 4

SELECT * FROM dept WHERE dept_id = 1 --is the PK id, or dept_id?

Решите это, указав идентификатор, который существует в таблице.Дважды проверьте, что ваши внешние ключи ссылаются на правильные удаленные первичные ключи (я отмечаю, что таблица гостей PK называется ID, а таблица dept PK выглядит как dept_id? Это правильно?) И что столбец, который ищется методом findOrFail, определенно является первичным ключомколонка.Есть ли какой-нибудь возможный способ, с помощью которого findOrFail может найти что-то неправильное и НЕ дать сбой?

Наконец, когда вы запускаете их в инструменте запросов, убедитесь, что база данных, которую вы запрашиваете при отладке, этоопределенно та же база данных, к которой подключен ваш сервер.

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