@Eugene70

Почему eloquent ищет другую сводную таблицу?

Здравствуйте. Имеются две модели
class Product extends Model
{
    public function categories(){
        return $this->belongsToMany('App\Category');
    }
}

и
class Category extends Model
{
    public function children(){
        return $this->hasMany(self::class, 'parent_id');
    }
}

А также миграции со сводной таблицей
class CreateProductCategoryTable extends Migration
{
    public function up()
    {
        Schema::create('product_category', function (Blueprint $table) {
            $table->BigIncrements('id');
            $table->BigInteger('product_id')->unsigned();
            $table->BigInteger('category_id')->unsigned();
            $table->timestamps();
        });

        Schema::table('product_category', function (Blueprint $table) {
            $table->foreign('product_id')->references('id')->on('products')
                ->onDelete('cascade')->onUpdate('cascade');
            $table->foreign('category_id')->references('id')->on('categories')
                ->onDelete('cascade')->onUpdate('cascade');
        });
    }

    public function down()
    {
        Schema::table('product_category', function (Blueprint $table){
            $table->dropForeign('product_category_product_id_foreign');
            $table->dropForeign('product_category_category_id_foreign');
        });
        Schema::dropIfExists('product_category');
    }

При попытке присвоить категорию к продукту с помощью этого кода,
public function store(Request $request)
    {
        $product = Product::create($request->except('categories'));

        if($request->has('categories')){
            $product->categories()
                ->attach($request->input('categories'));
        }

        return redirect()->route('product.index');
    }

возникает ошибка
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.category_product' doesn't exist (SQL: select `categories`.*, `category_product`.`product_id` as `pivot_product_id`, `category_product`.`category_id` as `pivot_category_id` from `categories` inner join `category_product` on `categories`.`id` = `category_product`.`category_id` where `category_product`.`product_id` = 5) (View: D:\OSPanel\domains\test.local\resources\views\product\_categories.blade.php)
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
Название сводной таблицы формируется из названий таблиц моделей в алфавитном порядке - category_product, а не product_category
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
JhaoDa
@JhaoDa
LaravelRUS Team
Потому что надо читать документацию, в которой написано, как ларавел формирует название для pivot-таблицы, если оно явно не указано в связи и как указать его явно, если не устраивает то, как это делает ларавел.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
26 апр. 2024, в 10:01
500 руб./за проект
26 апр. 2024, в 09:18
500 руб./в час
26 апр. 2024, в 06:46
1500 руб./в час