私はlaravelの新しい関係です。テーブル間で多対多の関係を作成しようとしています。データベースにデータを挿入すると問題が発生し、エラーが発生しました。
Connection.php行713のQueryException:SQLSTATE [42S02]:ベーステーブルまたはビューが見つかりません:1146テーブル 'learn.category_posts'は存在しません(SQL:insert into category_posts
(category_id
、posts_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()!!}
Laravelは多対多の関係のためにcategory_posts
テーブルを使用しようとしています。しかし、category_post
テーブルを作成したため、このテーブルはありません。 category_posts
へのテーブル。
Schema::table
は既存のテーブルを変更することです。Schema::create
新規作成します。
Laravelはテーブルの名前を推測しようとしますが、エラーを出さないように直接指定する必要があります。
これを試して:
class NameModel extends Model {
public $table = 'name_exact_of_the_table';
それがお役に立てば幸いです!
Post Modelでこれを追加するだけで問題を修正できます。
public function categories()
{
return $this->belongsToMany('App\Category','category_post','post_id','category_id');
}
category_post
は、使用するテーブルを示します。post_id
は、投稿IDを保存する列を示します。category_id
は、カテゴリIDを保存する列を示します。
テーブルを移行できない主な問題は、"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',
];
}
モデルにテーブル名を指定する必要があり、エラーが発生しません。
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 [〜#〜]
上記のコメントも正しいので、「投稿」モデルを「投稿」に変更します
appServiceProvider.phpなど、作成前のテーブルを使用している場合は、アプリをチェックインしてみてください
テーブルを作成せずに呼び出す場合があります。作成している場合はコメントしてから、php artisan migrateを実行します。