Как определить имя сводной таблицы в отношении ownToMany в Laravel? - PullRequest
0 голосов
/ 28 января 2020

У меня проблема с простой попыткой определить правильное имя для таблицы-посредника, используемой для многих-многих отношений в Laravel.

Я получил следующую ошибку при попытке получить доступ к eloquent отношения:

$ product-> category; Освещение / База данных / QueryException с сообщением «SQLSTATE [42S02]: базовая таблица или представление не найдены: 1146 Таблица« dolstore- laravel .category_product »не существует (SQL: выберите categories. *, category_product . product_id как pivot_product_id, category_product. category_id как pivot_category_id из categories внутреннее соединение category_product в categories. id = category_product. category_id, где category_product. product_id = 1) '

Моя миграция записана следующим образом:

    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name')->unique();
            $table->timestamps();
        });

        Schema::create('product_category', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('product_id');
            $table->unsignedBigInteger('category_id');
            $table->timestamps();

            $table->unique(['product_id', 'category_id']);

            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
            $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
        });
    }

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

    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name')->unique();
            $table->timestamps();
        });
        //Pivot Table
        // article_tag

        Schema::create('article_tag', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('article_id');
            $table->unsignedBigInteger('tag_id');
            $table->timestamps();

            $table->unique(['article_id', 'tag_id']);

            $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');
            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
        });
    }

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

Спасибо, что помогли мне понять это.

1 Ответ

1 голос
/ 28 января 2020

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

Теперь, laravel будет ожидать, что вы создали свою сводную таблицу в алфавитном порядке, они будут ожидать, что ваша сводная таблица была названа category_product, учитывая, что первая буква в вашей категории 'c 'является первым, чем на вашем столе продукт первой буквой является' p '. Вот почему в вашей сводной таблице article_tag она работала правильно?

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

public function product_categoreis() [
   return $this->belongsToMany('App\Category', 'product_category');
}
...