Проблема с данными заполнения в сводной таблице в Laravel - PullRequest
2 голосов
/ 21 апреля 2020

У меня проблема при попытке заполнить мою сводную таблицу в базе данных в Laravel. Я получаю сообщение об ошибке

Base table or view not found: 1146 Table 'user_cuisines' doesn't exist

И мое имя таблицы на самом деле user_cuisine, так что по какой-то причине laravel не показывает эту таблицу. В своих отношениях я добавил, что user_cuisine - это сводная таблица из-за алфавитного порядка. Любая помощь приветствуется. Вот мой код.

UserCuisineTableSeeder. php

<?php

use App\UserCuisine;
use App\UserProfile;
use Illuminate\Database\Seeder;

class UserCuisineTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $cuisines = UserCuisine::all();

        UserProfile::all()->each(function ($userProfile) use ($cuisines) { 
            $userProfile->cuisines()->attach(
                $cuisines->random(rand(1, 12))->pluck('id')->toArray()
            ); 
        });
    }
}

DatabaseSeeder. php

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(WhitelabelTableSeeder::class);
        $this->call(CitiesTableSeeder::class);
        $this->call(UserTableSeeder::class);
        $this->call(UserProfilePropertiesSeeder::class);
        $this->call(UserProfileTableSeeder::class);
        $this->call(FieldTableSeeder::class);
        $this->call(FieldValueTableSeeder::class);
        $this->call(CuisineTableSeeder::class);
        $this->call(LiteratureTableSeeder::class);
        $this->call(MusicTableSeeder::class);
        $this->call(SportTableSeeder::class);
        $this->call(TvTableSeeder::class);
        $this->call(UserCuisineTableSeeder::class);
        $this->call(UserInterestTableSeeder::class);
    }
}

UserCuisine. php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserCuisine extends Model
{
    protected $fillable = [
        'name'
    ];

    public function userProfiles()
    {
        return $this->belongsToMany(UserProfile::class, 'user_cuisine');
    }
}

UserProfile. php

<?php

namespace App;

class UserProfile
{

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function cuisines()
    {
        return $this->belongsToMany(UserCuisine::class, 'user_cuisine');
    }
}

user_cuisine_table

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUserCuisineTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('user_cuisine', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('cuisine_id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('user_cuisine');
    }
}

kitchen_table

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCuisineTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('cuisine', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('cuisine');
    }
}

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Laravel ожидается, что имя таблицы будет user_cuisines, но вы назвали его user_cuisine без "s"

Это можно исправить, изменив миграцию или добавив protected $table = 'user_cuisine'; к своей модели.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserCuisine extends Model
{

    protected $table = 'user_cuisine';

}

В соответствии с соглашением об именах, я бы рекомендовал изменить имя таблицы 100

1 голос
/ 21 апреля 2020

Кажется user_cuisines таблица не существует, Вы создали cuisine не user_cuisines

Просто поместите ниже код в UserCuisine модель.

protected $table= 'user_cuisine';

Я бы порекомендовал всегда используйте флаг -m при создании модели, чтобы избежать ошибок такого типа, например.

php artisan make:model ModelName -m
...