IT-Swarm.Net

Como corrigir o erro Tabela base ou visualização não encontrada: 1146 Tabela tabela de relacionamento laravel?

Eu sou um novo de laravel Eu tento criar relacionamento muitos para muitos entre a tabela, Meu problema quando estou inserir dados no banco de dados recebi erros

QueryException na linha Connection.php 713: SQLSTATE [42S02]: Tabela base ou view não encontrada: 1146 A tabela 'learn.category_posts' não existe (SQL: inserir em category_posts (category_id, posts_id) valores (4,))

alguém pode me ajudar pls. e aqui abaixo está minha migração e código:

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();
    });
}

e meu modelo 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');
    }   
}

Meu 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');
}

Minha Visão 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

Parece Laravel está tentando usar a tabela category_posts (por causa do relacionamento muitos-para-muitos). Mas você não tem essa tabela porque criou a tabela category_post. Altere o nome da tabela para category_posts.

5
Alexey Mezenin

O Laravel tenta adivinhar o nome da tabela, você tem que especificá-lo diretamente para que ele não dê esse erro ..

Tente isto:

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

Espero que ajude!

4
jpasosa

O mais simples é alterar o nome da tabela padrão atribuído ao modelo. Basta colocar o código a seguir, protected $table = 'category_posts'; em vez de protected $table = 'posts';, então ele fará o truque.

No entanto, se você consultar a documentação do Laravel, encontrará a resposta. Aqui o que diz

Por convenção, o "caso de serpente", o nome plural da classe (modelo) será usado como o nome da tabela, a menos que outro nome seja especificado explicitamente

Melhor para você usar o comando artisan para fazer o modelo e o arquivo de migração ao mesmo tempo, use o seguinte comando,

php artisan make:model Test --migration

Isso criará uma classe de modelo e uma classe de migração em seu projeto Laravel. Vamos dizer que criou os seguintes arquivos,

Test.php

2018_06_22_142912_create_tests_table.php

Se você olhar o código nesses dois arquivos, você verá

2018_06_22_142912_create_tests_table.php up da função,

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

Aqui ele gerou automaticamente o código com o nome da tabela 'tests', que é o nome plural da classe que está em Test.php file.

1
Chathura D Ranathunga

Você pode simplesmente corrigir o problema adicionando isto em Post Model ,

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

category_post indica a tabela que você deseja usar.
post_id indica a coluna onde você quer armazenar o ID dos posts.
category_id indica a coluna onde você quer armazenar o id das categorias.

0
Anand Mainali

Schema :: table é para modificar uma tabela existente, use Schema :: create para criar new. ;)

0
Shal

Você deve alterar/adicionar no seu PostController: (e alterar PostsController para 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: usando rota () significa que você nomeou sua rota como tal

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

UPDATE

Os comentários acima também estão corretos, mude seu modelo de "Postagens" para "Postar"

0
Steven Grauwmans

O principal problema para fazer com que sua tabela seja incapaz de migrar, é que você tem uma consulta em execução em seu "AppServiceProvider.php". Tente verificar seu provedor de serviço e desabilite o código enquanto isso, e execute "php artisan migrate"

0
Aldrin Masamoc Mojica