web-dev-qa-db-ja.com

エラーベーステーブルまたはビューが見つかりません:1146テーブルlaravel関係テーブル?

私はlaravelの新しい関係です。テーブル間で多対多の関係を作成しようとしています。データベースにデータを挿入すると問題が発生し、エラーが発生しました。

Connection.php行713のQueryException:SQLSTATE [42S02]:ベーステーブルまたはビューが見つかりません:1146テーブル 'learn.category_posts'は存在しません(SQL:insert into category_postscategory_idposts_id)値(4、))

誰でも私を助けることができます。そして、ここに私の移行とコードがあります:

2016_08_04_131009_create_table_posts.php

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->increments('id');
        $table->text('title');
        $table->text('body');
        $table->timestamps();
    });
}

2016_08_04_131053_create_table_categories.php

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

2016_08_04_131413_create_table_category_posts.php

public function up()
{
    Schema::create('category_post', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('category_id')->unsigned();
        $table->integer('post_id')->unsigned();
        $table->foreign('category_id')->references('id')->on('categories')->onUpdate('cascade')->onDelete('cascade');
        $table->foreign('post_id')->references('id')->on('posts')->onUpdate('cascade')->onDelete('cascade');
        $table->timestamps();
    });
}

と私のモデルPosts.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Posts extends Model
{
    protected $table = 'posts';

    public function categories()
    {
        return $this->belongsToMany('App\Category');
    }
}

Category.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $table = 'categories'; 

    public function posts()
    {
        return $this->belongsToMany('App\Posts');
    }   
}

私のPostsController.php

public function create()
{
    $categories = Category::all();
    return view('create',compact('categories'));
}

public function store(Request $request)
{
   $post = new Posts;
   $post->title = $request->title;
   $post->body = $request->body;
   $post->categories()->attach($request->categories_id);

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

マイビューcreate.blade.php

{!!Form::open(array('route' => 'store', 'method' => 'POST'))!!}

    {{Form::text('title')}}<br>
    {{Form::textarea('body')}}<br>
    <select name="categories_id" multiple>
        @foreach ($categories as $category)
            <option value="{{ $category->id }}">{{ $category->name }}</option>
        @endforeach
    </select>
    <br>
    {{Form::submit('submit')}}

{!!Form::close()!!}
7
He7nG

Laravelは多対多の関係のためにcategory_postsテーブルを使用しようとしています。しかし、category_postテーブルを作成したため、このテーブルはありません。 category_postsへのテーブル。

9
Alexey Mezenin

Schema::tableは既存のテーブルを変更することです。Schema::create新規作成します。

6
Shal

Laravelはテーブルの名前を推測しようとしますが、エラーを出さないように直接指定する必要があります。

これを試して:

class NameModel extends Model {
    public $table = 'name_exact_of_the_table';

それがお役に立てば幸いです!

6
jpasosa

Post Modelでこれを追加するだけで問題を修正できます。

public function categories()
{
 return $this->belongsToMany('App\Category','category_post','post_id','category_id');                 
}

category_postは、使用するテーブルを示します。
post_idは、投稿IDを保存する列を示します。
category_idは、カテゴリIDを保存する列を示します。

1
Anand Mainali

テーブルを移行できない主な問題は、"AppServiceProvider.php"でクエリを実行していることです。serviceproviderを確認し、その間コードを無効にしてから実行してください。 php artisan migrate

最も簡単なことは、モデルに割り当てられたデフォルトのテーブル名を変更することです。次のコード、protected $table = 'category_posts'; の代わりに protected $table = 'posts';その後、トリックを行います。

ただし、Laravelドキュメントを参照すると、答えが見つかります。

慣例により、別の名前が明示的に指定されない限り、クラス(モデル)の複数形の名前である「スネークケース」がテーブル名として使用されます。

より良いのは、artisanコマンドを使用してモデルと移行ファイルを同時に作成し、次のコマンドを使用することです。

php artisan make:model Test --migration

これにより、Laravelプロジェクトにモデルクラスと移行クラスが作成されます。次のファイルを作成したとしましょう。

Test.php

2018_06_22_142912_create_tests_table.php

表示されるこれらの2つのファイルのコードを見ると、

2018_06_22_142912_create_tests_table.phpファイルのアップ機能、

 public function up()
 {
      Schema::create('tests', function (Blueprint $table) {
      $table->increments('id');
      $table->timestamps();
      });
 }

ここでは、Test.phpファイルにあるクラスの複数名である 'tests'のテーブル名でコードを自動的に生成しました。

あなたのベーステーブルまたはビューが見つからないというエラーを解決するには、@ Alexey Mezeninがテーブル名を変更すると言ったようにできますcategory_postからcategory_posts

しかし、私の場合のように名前を変更したくない場合はinventoryテーブルを使用するため、sで接尾辞を付けたくないので、テーブルを提供しますモデルの名前はprotected $table = 'Table_name_as_you_want'そして、テーブル名を変更する必要はありません

たとえば、エラーが発生しているモジュールのモデルを変更します。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Inventory extends Model
{
    protected $table = 'inventory';

    protected $fillable = [
        'supply', 'order',
    ];
}

モデルにテーブル名を指定する必要があり、エラーが発生しません。

0
Haritsinh Gohil

PostControllerで変更/追加する必要があります:(そしてPostsControllerをPostControllerに変更します)

public function create()
{
    $categories = Category::all();
    return view('create',compact('categories'));
}

public function store(Request $request)
{
    $post = new Posts;
    $post->title = $request->get('title'); // CHANGE THIS
    $post->body = $request->get('body'); // CHANGE THIS
    $post->save(); // ADD THIS
    $post->categories()->attach($request->get('categories_id')); // CHANGE THIS

    return redirect()->route('posts.index'); // PS ON THIS ONE
}

PS:route()を使用すると、ルートにそのような名前を付けたことを意味します

Route::get('example', 'ExampleController@getExample')->name('getExample');

[〜#〜] update [〜#〜]

上記のコメントも正しいので、「投稿」モデルを「投稿」に変更します

0

appServiceProvider.phpなど、作成前のテーブルを使用している場合は、アプリをチェックインしてみてください

テーブルを作成せずに呼び出す場合があります。作成している場合はコメントしてから、php artisan migrateを実行します。

0
luis