Связь подмостки laravel

Хороший день

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

Illuminate\Database\QueryException: SQLSTATE [HY000]: Общая ошибка: 1005 Ca n't поверьте table usaly_bd.#sql-1d3c_2bb (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table companies add constraint companies_ client_id_foreign foreign key (client_id) references clients (company_id) )

Это моя миграция clients

 public function up()
    {
        Schema::create('clients', function (Blueprint $table) {
            $table->increments('client_id');
            $table->integer('nuip')->nullable();
            $table->string('first_name')->nullable();
            $table->string('last_name')->nullable();
            $table->integer('phone')->nullable();
            $table->integer('cellphone')->nullable();
            $table->string('email')->nullable();
            $table->string('type_client')->nullable();
            $table->timestamps();


        });
    }

Миграция companies

public function up()
    {
        Schema::create('companies', function (Blueprint $table) {
            $table->increments('company_id')->unsigned();
            $table->integer('name')->nullable();
            $table->string('business_name')->nullable();
            $table->string('douments')->nullable();
            $table->timestamps();

            //Relacion
            $table->unsignedInteger('client_id');
            $table->foreign('client_id')->references('company_id')->on('clients');


        });
    }

Я благодарен за Вашу помощь

2
задан 02.01.2019, 18:25
3 ответа

У тебя есть плохо колонна, на которую ссылается ты FOREIGN KEY

в настоящее время эта asГ -

$table->unsignedInteger('client_id');
$table->foreign('client_id')->references('company_id')->on('clients');

, Но deberГ, - чтобы быть asГ -

$table->unsignedInteger('client_id');
$table->foreign('client_id')->references('client_id')->on('clients');

, Так как ключ forГЎnea в твоей таблице companies указывает в таблицу clients тогда там на нее relaciГіn, не tenГ-схватывай ее правильная и поскольку ты имеешь в твоем вопросе твой ключ forГЎnea эта плохо, что указывает на первичный ключ, но той же таблицы, что и esta содержа

Он Снабжает ссылками ее documentaciГіn Foreign keys

Comenta, как его ты было

1
ответ дан 20.11.2019, 01:51
  • 1
    Здравствуйте! Большое спасибо из-за твоей помощи :D это было этим и порядок моих миграций они не были правильны, я покрываю создавать таблицу clients сначала и потом companies, порядок миграций затрагивает консультации также –  Daniel Lopez 03.01.2019, 18:11
  • 2
    ничего @DanielLopez помни каждый раз, когда ты это занял мы можем помогать тебе привету –   03.01.2019, 18:13

Уважаемый.

, Чтобы решать эту проблему в laravel, может осуществляться следующего способа.

  • Сначала, нужно создавать миграцию, где он только верит в поля таблицы.
  • Секунда, нужно создавать новую миграцию для aГ±adir чужеземные ключи в вышеупомянутую таблицу.

В этом случае этой формы:

Миграция равный Кльентс Мантенер. Создавать Миграцию так называемый "create_companies_table"

public function up()
    {
        Schema::create('companies', function (Blueprint $table) {
            $table->increments('company_id')->unsigned();
            $table->integer('name')->nullable();
            $table->string('business_name')->nullable();
            $table->string('douments')->nullable();
            $table->timestamps();

            //campo con el index para la relacion
            $table->integer('client_id')->unsigned()-index('client_id_foreign');


        });
    }

Вторая так называемая миграция "add_fk_to_companies_table"

public function up()
{
    Schema::table('companies', function(Blueprint $table)
    {
       //crea la clave foranea hacia la tabla clients
        $table->foreign('client_id')->references('id')->on('clients')->onUpdate('RESTRICT')->onDelete('RESTRICT');

    });
}

Надеялась, что он полезен!!!

AsegГєrate уважения порядка cronolГіgico миграций, сначала та, которая создает таблицу, despuГ©s та, которая создает ее relaciГіn.

0
ответ дан 20.11.2019, 01:51
  • 1
    создавать migració n, чтобы манипулировать только ключами forá neas - ненужный шаг с тех пор, как вышеупомянутые ключи могут идти верно и он vá lido esté n внутри migració n главный –   03.01.2019, 12:13
  • 2
    если это добавочный шаг, но с этим ты уважаешь порядок cronologioco создания, он аккуратнее. Какой изюм, если ты должен создавать таблицу из-за X связей перед другой таблицей, которую ты снабжаешь ссылками? он даст тебе ошибку, так как таблица не существует. Для этого рекомендуемо создавать ссылки в отдельных миграциях. Я не знаю, если это считается хорошей практикой в laravel, но лично он произвел мне меньше конфликтов в больших проектах. ¿ Что ты думаешь по этому поводу? –  Osvaldo Alvarado 04.01.2019, 04:20
  • 3
    что порядок продолжает поддерживать даже с ключами, созданными в тех же миграциях подмостков где estará n, что тема не связана с, что, если он делается таким образом, функционирует или нет –   04.01.2019, 05:05

Желанный Даниэль Лопес, ошибка находится, в котором ты связываешь твой чужеземный ключ с элементом, который не существует в таблице clients., другой вещи также состоит в том, что у твоего первичного ключа таблицы clients есть то же имя, что и ключ forГЎnea таблицы companies, так что она soluciГіn она была бы этой:

 $table->foreign('client_id')->references('client_id')->on('clients');
0
ответ дан 20.11.2019, 01:51
  • 1
    Tambié n он необходим доводить до сведения что-то больше, что в будущее ты должен иметь в виду, в твоей таблице clients твой первичный ключ - client_id. Laravel принимает, что первичный ключ каждого migració n у него есть имя " id". необходимо выделять это, так как, если ты меняешь эти имена tendrá s, что определять имя твоего первичного ключа в соответствующей модели. Пример: protected $primaryKey = ' client_id'; –  Víctor Hugo Tirado 03.01.2019, 12:28
  • 2
    Здравствуйте! Большое спасибо из-за твоей помощи :D это был этим больше порядок миграций –  Daniel Lopez 03.01.2019, 18:11