php - SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel_abonamenty2.currencies' doesn't exist

I've got this error

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel_abonamenty2.currencies' doesn't exist (SQL: select `id`, `currency`, `course` from `currencies`)

This is my controller which generate error. I don't know why Laravel is searching for currencies table. My table and migration is called Currencys.

public function create()
{
    $users = User::all('showname', 'id');
    $forms = Form::all('id', 'form');
    $currencys = Currency::all('id', 'currency', 'course');
    return view('invoices.create')->with('users', $users, 'forms', 'currencys');
}

This is mine currency model:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Currency extends Model
{
    protected $fillable = [
        'id', 'currency', 'course',
    ];

    public function invoice()
    {
        return $this->belongsTo('App\Invoice');
    }

    public function proform()
    {
        return $this->belongsTo('App\Proform');
    }
}

This is my Currencys migration

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class Currencys extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('currencys', function (Blueprint $table) {
            $table->increments('id');
            $table->string('currency')->nullable();
            $table->string('course')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('currencys');
    }
}

Answer

Solution:

Because the plural of currency is currencies and not currencys. Laravel automatically detects the table name of the snake case plural name of the model. documentation

In your model you can specify another table name like:

protected $table = 'currencys';

With that laravel will search the currencys table.

Answer

Solution:

By convention, the "snake case", plural name of the class will be used as the table name unless another name is explicitly specified. https://laravel.com/docs/7.x/eloquent#eloquent-model-conventions

In your case, it converts the Currency(model name) to plural currencies. Therefore,if you want a custom table name,

You need to specify that name of the table in the model.

Currency Model

class Currency extends Model
{
  protected $table="currency";
...
}

Source