Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 06.10.2016 09:56:47

Ошибка миграции: strtolower()

Приветствую всех!
При выполнении команды php artisan migrate выдается сообщение в консоли: "[ErrorException]: strtolower() expects parameter 1 to be string, array given.
Виновник ошибки миграция:

Schema::create('questions_tags_relationships', function (Blueprint $table) {
            $table->integer('question_id');
            $table->integer('tag_id');
            $table->primary(['question_id'], ['tag_id']);
        });

        Schema::table('questions_tags_relationships', function ($table) {
            $table->foreign('question_id')->references('id')->on('questions');
            $table->foreign('tag_id')->references('id')->on('tags');
        });

В чем собственно может быть проблема?

Изменено MMysiv (06.10.2016 09:57:39)

Не в сети

#2 06.10.2016 10:37:57

Re: Ошибка миграции: strtolower()

может быть так    $table->primary(['question_id', 'tag_id']); ?

Не в сети

#3 06.10.2016 11:04:38

Re: Ошибка миграции: strtolower()

а нахрена комбинированный примари на таблицу связей ?
понты?
если нет, то по простому индексу на каждую колонку и 2 простый форейна.

Изменено hzone (06.10.2016 17:30:26)

Не в сети

#4 06.10.2016 15:33:14

Re: Ошибка миграции: strtolower()

hzone пишет:

а нахрена комюинированный примари на таблицу связей ?
понты?
если нет, то по простому индексу на каждую колонку и 2 простый форейна.

Благодарю за помощь! Миграция проходит, но выдает что не может установить внешние ключи:

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL  
  : alter table `blagst_questions_tags_relationships` add constraint `questio  
  ns_tags_relationships_question_id_foreign` foreign key (`question_id`) refe  
  rences `blagst_questions` (`id`))   

Вот собственно сама миграция.

Schema::create('questions_tags_relationships', function (Blueprint $table) {
            $table->integer('question_id')->index();
            $table->integer('tag_id')->index();
        });

        Schema::table('questions_tags_relationships', function ($table) {
            $table->foreign('question_id')->references('id')->on('questions');
            $table->foreign('tag_id')->references('id')->on('tags');
        });

А вот миграции таблиц questions и tags:

Schema::create('questions', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('question_author')->unsigned();
            $table->string('question_title')->index();
            $table->text('question_details');
            $table->string('question_status')->default('Ожидает подтверждения');
            $table->timestamp('question_created');
            $table->timestamps();
        });

        Schema::table('questions', function ($table) {
            $table->foreign('question_author')->references('id')->on('users');
        });
Schema::create('tags', function (Blueprint $table) {
            $table->increments('id');
            $table->string('tag_name');
            $table->string('tag_name_eng');
            $table->string('tag_description');
            $table->timestamp('question_created');
            $table->timestamps();
        });

Не в сети

#5 06.10.2016 17:29:58

Re: Ошибка миграции: strtolower()

Ох....
Сначала создаются таблицы с данными, а уже потом связей. А то форейн не видит куда ссылается - нет такой таблицы, тоесть у тебя наоборот. связи потом таблицы, при этом связи не видят что связывать. Понятно?

Schema::create('questions_tags', function (Blueprint $table) {
    $table->bigInteger('question_id');
    $table->bigInteger('tag_id');
    $table->foreign('question_id')->references('id')->on('questions')->onDelete('cascade');
    $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
});

Изменено hzone (06.10.2016 17:31:58)

Не в сети

#6 06.10.2016 17:32:56

Re: Ошибка миграции: strtolower()

и
$table->timestamp('question_created');
тебе не надо. в $table->timestamps(); всё и так есть

Не в сети

#7 06.10.2016 18:27:18

Re: Ошибка миграции: strtolower()

Добавь unsigned():

$table->integer('question_id')->unsigned()->index();
$table->integer('tag_id')->unsigned()->index();

Не в сети

#8 06.10.2016 20:19:16

Re: Ошибка миграции: strtolower()

AlexeyMezenin пишет:

Добавь unsigned():

$table->integer('question_id')->unsigned()->index();
$table->integer('tag_id')->unsigned()->index();

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

Не в сети

#9 06.10.2016 22:35:18

Re: Ошибка миграции: strtolower()

hzone пишет:

Ох....
Сначала создаются таблицы с данными, а уже потом связей. А то форейн не видит куда ссылается - нет такой таблицы, тоесть у тебя наоборот. связи потом таблицы, при этом связи не видят что связывать. Понятно?

Конечно, я понимаю этот момент. Но в том и дело, что таблица отношения создается последней. Вот эти файлы:

Questions table: 2016_10_06_061046_create_questions_table.php
Tags table: 2016_10_06_063818_create_tags_table.php
QuestionsTagsRelationships: 2016_10_06_063900_create_questions_tags_relationships.php

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

Не в сети

#10 07.10.2016 00:30:26

Re: Ошибка миграции: strtolower()

я писал готовый код выше. используй

Не в сети

#11 07.10.2016 00:31:17

Re: Ошибка миграции: strtolower()

и форейны пиши не вторым дёрганьем схемы, а внутри первого.

Не в сети

#12 07.10.2016 01:03:01

Re: Ошибка миграции: strtolower()

hzone пишет:

и форейны пиши не вторым дёрганьем схемы, а внутри первого.

Я использовал ваш код. Таблицы создаются, но форейны нет. Все так же ругается на таблицу отношений. В чем еще может быть проблема? Может есть способ проверить очередность создания таблиц?

Не в сети

#13 07.10.2016 01:24:26

Re: Ошибка миграции: strtolower()

Хех. Возможно это странно только мне, но проблема решилась после описания функции down(). Во всяком случае, еще 1 вопрос: создавать ли индексы в столбцах таблицы отношений?

Не в сети

#14 07.10.2016 05:57:26

Re: Ошибка миграции: strtolower()

hzone пишет:
AlexeyMezenin пишет:

Добавь unsigned():

$table->integer('question_id')->unsigned()->index();
$table->integer('tag_id')->unsigned()->index();

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

Я написал это в дополнение к твоим словам, думаю это очевидно. Без unsigned() работать не будет.

Не в сети

#15 07.10.2016 13:07:15

Re: Ошибка миграции: strtolower()

MMysiv пишет:

Хех. Возможно это странно только мне, но проблема решилась после описания функции down(). Во всяком случае, еще 1 вопрос: создавать ли индексы в столбцах таблицы отношений?

конечно, и даже можно уникальный-комбинированный

Не в сети

#16 07.10.2016 13:08:25

Re: Ошибка миграции: strtolower()

AlexeyMezenin пишет:
hzone пишет:
AlexeyMezenin пишет:

Добавь unsigned():

$table->integer('question_id')->unsigned()->index();
$table->integer('tag_id')->unsigned()->index();

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

Я написал это в дополнение к твоим словам, думаю это очевидно. Без unsigned() работать не будет.

интересно как ты будешь себя чуствовать на posgresql или ibm informix )
но всё равно сапсибо за дискуссию)

Не в сети

#17 07.10.2016 13:48:37

Re: Ошибка миграции: strtolower()

hzone пишет:

интересно как ты будешь себя чуствовать на posgresql или ibm informix )
но всё равно сапсибо за дискуссию)

Слов много, смысла ноль. Ты хочешь сказать, что unsigned() здесь не нужен? Если да, то почему?

Не в сети

#18 07.10.2016 15:02:18

Re: Ошибка миграции: strtolower()

AlexeyMezenin пишет:
hzone пишет:

интересно как ты будешь себя чуствовать на posgresql или ibm informix )
но всё равно сапсибо за дискуссию)

Слов много, смысла ноль. Ты хочешь сказать, что unsigned() здесь не нужен? Если да, то почему?

unsigned присуще всё же больше только mysql
у постгреса нет такого понятия, либо пиши эту функцию сам (и не забудь заодно написать тип данных, его поддерживающий)

Не в сети

Подвал раздела