Создание ссылки на столбец 2 столбца из отдельных таблиц laravel

Я пытаюсь взять 2 таблицы, в каждой из которых есть столбцы с именем email, password и isBusiness, и автоматически обновить эти значения в одной таблице с именем authentication.

Перенос аутентификации

Schema::create('authentication', function (Blueprint $table) {
        $table->increments('auth_id');
        $table->string('email');
        $table->foreign('email')->references('email')->on('businesses');
        $table->foreign('email')->references('email')->on('consumers');
        $table->string('password');
        $table->foreign('password')->references('password')->on('businesses');
        $table->foreign('password')->references('password')->on('consumers');
        $table->integer('isBusiness');
        $table->foreign('isBusiness')->references('isBusiness')->on('businesses');
        $table->foreign('isBusiness')->references('isBusiness')->on('consumers');
        $table->timestamps();
    });

Ошибка

 SQLSTATE[HY000]: General error: 1005 Can't create table `sprout_db`.`#sql-2
  7a4_30` (errno: 150 "Foreign key constraint is incorrectly formed")

Деловой стол

Schema::create('businesses', function (Blueprint $table) {
        $table->increments('bus_id', 11);
        $table->string('bus_name', 50);
        $table->string('bus_address', 50);
        $table->string('bus_city', 50);
        $table->string('bus_prov', 50);
        $table->string('bus_postal', 50);
        $table->string('bus_phone', 50);
        $table->string('email', 50);
        $table->string('password', 100);
        $table->integer('isBusiness')->default('1');
        $table->timestamps();
        $table->rememberToken();
        $table->engine = 'InnoDB';
    });

Потребительский стол

Schema::create('consumers', function (Blueprint $table) {
            $table->increments('con_id', 11);
            $table->string('con_fname', 50);
            $table->string('con_lname', 50);
            $table->string('email', 50);
            $table->string('password', 100);
            $table->integer('isBusiness')->default('0');
            $table->timestamps();
            $table->rememberToken();
            $table->engine = 'InnoDB';
        });

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

Я не знаком с laravel, но мне кажется, что вы пытаетесь сделать ссылку на одно поле соответствующим полем в двух разных таблицах? Хотя это возможно, это не лучшая идея.

Uueerdo 09.06.2018 00:53

Тем не менее ... похоже, вам, вероятно, нужно прекратить попытки сделать поля varchar "беззнаковыми". ;)

Uueerdo 09.06.2018 00:58

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

Jay 09.06.2018 02:35

Вы должны проиндексировать поля, на которые ссылается внешний ключ (и они должны существовать, поэтому таблицы, на которые есть ссылки, должны быть созданы в первую очередь); но, как я уже сказал в исходном комментарии, наличие ссылки на одно поле на несколько таблиц обычно является очень плохой идеей. Если вы думаете, что это означает «должно соответствовать значению в tableA или tableB», это не так; это означает, что значение должно существовать в ОБЕИХ таблицах (и в зависимости от опций ссылки может «каскадировать» изменения из любой из них).

Uueerdo 11.06.2018 19:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
545
1

Ответы 1

Просто добавьте к вашему ключу метод index ().

    $table->integer('isBusiness')->index()->unsigned();

зачем мне добавлять к нему index() и unsigned()?

Jay 09.06.2018 06:42

Я пробовал безуспешно. Я просто хотел узнать причину этого.

Jay 09.06.2018 07:23

потому что целое число внешнего ключа должно быть индексным в его таблице и беззнаковым

Castro Alhdo 09.06.2018 15:39

так во всех таблицах ключ должен быть индексированным и беззнаковым? или просто таблица аутентификации?

Jay 10.06.2018 20:55

@Jay обычно внешние ключи не создаются для строковых значений; это разрешено, но относительно дорого по сравнению с целыми числами. Беззнаковая часть не требуется (даже для целых чисел), но поля, на которые ссылается внешний ключ, должны быть проиндексированы.

Uueerdo 11.06.2018 19:51

Другие вопросы по теме