wake-up-neo.net

So beheben Sie den Fehler Basistabelle oder Ansicht nicht gefunden: 1146 Tabelle mit Tabellenkombinationen?

Ich bin ein Neuling von Laravel. Ich versuche, eine Beziehung zwischen vielen und vielen Tabellen aufzubauen. Mein Problem, wenn ich Daten in die Datenbank einfüge, habe ich Fehler erhalten

QueryException in Connection.php Zeile 713: SQLSTATE [42S02]: Basistabelle oder -ansicht nicht gefunden: 1146 Tabelle 'learn.category_posts' ist nicht vorhanden (SQL: Einfügen in category_posts (category_id, posts_id) -Werte (4,))

kann mir jemand helfen pls. Und hier ist meine Migration und mein 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();
    });
}

und mein Modell 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');
    }   
}

Meine BeiträgeController.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');
}

Meine Ansicht 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

Es scheint, dass Laravel versucht, category_posts-Tabelle zu verwenden (wegen einer Viele-zu-Viele-Beziehung). Sie haben diese Tabelle jedoch nicht, da Sie eine category_post-Tabelle erstellt haben. Ändern Sie den Namen der Tabelle in category_posts.

5
Alexey Mezenin

Laravel versucht, den Namen der Tabelle zu erraten. Sie müssen ihn direkt angeben, damit Sie diesen Fehler nicht erhalten.

Versuche dies:

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

Ich hoffe das hilft!

4
jpasosa

Am einfachsten ist es, den für das Modell zugewiesenen Standardtabellennamen zu ändern. Fügen Sie einfach den folgenden Code ein protected $table = 'category_posts'; anstelle von protected $table = 'posts';, dann wird der Trick ausgeführt.

Wenn Sie jedoch auf Laravel -Dokumentation verweisen, finden Sie die Antwort. Hier, was es sagt,

Konventionell wird der Pluralname der Klasse (Modell) als "Schlangenfall" als Tabellenname verwendet, sofern nicht ausdrücklich ein anderer Name angegeben wird

Verwenden Sie den handwerklichen Befehl, um das Modell und die Migrationsdatei gleichzeitig zu erstellen. Verwenden Sie den folgenden Befehl:

php artisan make:model Test --migration

Dadurch werden eine Modellklasse und eine Migrationsklasse in Ihrem Laravel - Projekt erstellt. Nehmen wir an, es wurden folgende Dateien erstellt:

Test.php

2018_06_22_142912_create_tests_table.php

Wenn Sie sich den Code in diesen beiden Dateien ansehen, sehen Sie:

2018_06_22_142912_create_tests_table.php -Aufwärtsfunktion,

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

Hier wurde automatisch ein Code mit dem Tabellennamen 'tests' generiert. Dabei handelt es sich um den Pluralnamen der Klasse, die sich in der Datei Test.php befindet.

Zum Lösen Ihrer Basistabelle oder des Fehlers "Ansicht nicht gefunden" können Sie Folgendes tun: @Alexey Mezenin hat den Tabellennamen category_post bis category_posts,

aber wenn Sie den Namen nicht wie in meinem Fall ändern möchten, bin ich mit inventory Tabelle, also möchte ich es nicht durch s ergänzen, also werde ich Tabelle zur Verfügung stellen Name im Modell als protected $table = 'Table_name_as_you_want' und dann muss der Tabellenname nicht geändert werden:

Ändern Sie Ihr Modell des Moduls, in dem Sie eine Fehlermeldung erhalten, zum Beispiel:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

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

sie müssen den Tabellennamen im Modell angeben, dann wird kein Fehler ausgegeben.

0
Haritsinh Gohil

Sie können das Problem einfach beheben, indem Sie dies in Post Model , hinzufügen.

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

category_post gibt die Tabelle an, die Sie verwenden möchten.
post_id gibt die Spalte an, in der Sie die Beitrags-ID speichern möchten.
category_id gibt die Spalte an, in der Sie die Kategorien-ID speichern möchten.

0
Anand Mainali

Schema :: table dient zum Ändern einer vorhandenen Tabelle. Verwenden Sie Schema :: create zum Erstellen von new. ;)

0
Shal

Sie sollten in Ihrem PostController Folgendes ändern/hinzufügen: (und PostController in PostController umwandeln)

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: Mit route () haben Sie Ihre Route als solche bezeichnet

Route::get('example', '[email protected]')->name('getExample');

UPDATE

Die obigen Kommentare sind auch richtig, ändern Sie das 'Posts'-Modell in' Post '.

0

Das Hauptproblem, das dazu führt, dass Ihre Tabelle nicht migriert werden kann, besteht darin, dass die Abfrage "AppServiceProvider.php" ausgeführt wird. Versuchen Sie, Ihren Serviceprovider zu überprüfen, und deaktivieren Sie den Code für die Zwischenzeit.

versuchen Sie, die App einzuchecken, wenn Sie die Tabellen verwenden, bevor sie erstellt werden, z. B. appServiceProvider.php

sie können die Tabelle aufrufen, ohne sie erstellt zu haben. Wenn dies der Fall ist, kommentieren Sie sie und führen Sie dann php artisan migrate aus.

0
luis