Je suis un nouveau de laravel J'essaie de créer une relation plusieurs à plusieurs entre table, mon problème lorsque je suis insérer des données dans la base de données j'ai des erreurs
QueryException dans Connection.php ligne 713: SQLSTATE [42S02]: Table ou vue de base introuvable: 1146 La table 'learn.category_posts' n'existe pas (SQL: insérer dans category_posts
(category_id
, posts_id
) (4,))
quelqu'un peut-il m'aider à pls. et voici ci-dessous mon migrate et code:
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();
});
}
et mon modèle 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');
}
}
Catégorie.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
protected $table = 'categories';
public function posts()
{
return $this->belongsToMany('App\Posts');
}
}
Mes publicationsController.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');
}
Ma vue 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()!!}
Il semble que Laravel tente d'utiliser la table category_posts
(en raison d'une relation plusieurs à plusieurs). Mais vous n'avez pas cette table, car vous avez créé la table category_post
. Changez le nom de la table en category_posts
.
Laravel essaye de deviner le nom de la table, vous devez le spécifier directement pour qu'il ne vous donne pas cette erreur.
Essaye ça:
class NameModel extends Model {
public $table = 'name_exact_of_the_table';
J'espère que ça aide!
Le plus simple est de modifier le nom de la table par défaut attribué au modèle. Il suffit de mettre le code suivant, protected $table = 'category_posts';
au lieu de protected $table = 'posts';
, alors tout ira bien.
Cependant, si vous vous référez à la documentation de Laravel, vous trouverez la réponse. Voici ce que ça dit,
Par convention, le nom au pluriel "cas du serpent" de la classe (modèle) sera utilisé comme nom de la table sauf si un autre nom est spécifié explicitement
Mieux vaut utiliser la commande artisan pour créer le modèle et le fichier de migration en même temps, utilisez la commande suivante,
php artisan make:model Test --migration
Cela créera une classe de modèle et une classe de migration dans votre projet Laravel. Disons qu'il a créé les fichiers suivants,
Test.php
2018_06_22_142912_create_tests_table.php
Si vous regardez le code dans ces deux fichiers, vous verrez,
2018_06_22_142912_create_tests_table.php fonction "fichiers",
public function up()
{
Schema::create('tests', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
}
Ici, il a généré automatiquement du code avec le nom de table de 'tests' qui est le nom au pluriel de cette classe qui se trouve dans Test.php file.
Vous pouvez simplement résoudre le problème en ajoutant ceci dans Post Model ,
public function categories()
{
return $this->belongsToMany('App\Category','category_post','post_id','category_id');
}
category_post
indique la table que vous souhaitez utiliser.post_id
indique la colonne dans laquelle vous souhaitez stocker l'identifiant de publication.category_id
indique la colonne dans laquelle vous voulez stocker l'id des catégories.
Schema :: table est pour modifier une table existante, utilisez Schema :: create pour créer un nouveau. ;)
Vous devez changer/ajouter dans votre PostController: (et changer PostController en 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: utiliser route () signifie que vous avez nommé votre route comme telle
Route::get('example', 'ExampleController@getExample')->name('getExample');
METTRE &AGRAVE; JOUR
Les commentaires ci-dessus sont également corrects, changez votre modèle 'Posts' en 'Post'
Le principal problème pour rendre votre table impossible à migrer est que vous avez une requête en cours d'exécution sur votre "AppServiceProvider.php". Essayez de vérifier votre fournisseur de service et de désactiver le code pour le moment, et exécutez "php artisan migrate"