web-dev-qa-db-fra.com

Comment corriger l'erreur Table de base ou vue non trouvée: 1146 Table table de relations laravel?

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()!!}
4
He7nG

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.

5
Alexey Mezenin

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!

4
jpasosa

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.

1

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.

0
Anand Mainali

Schema :: table est pour modifier une table existante, utilisez Schema :: create pour créer un nouveau. ;)

0
Shal

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'

0
Steven Grauwmans

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"

0