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

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Decoding the Error: Fixing SQLSTATE[42S02] Table Not Found in Laravel Eloquent

As a senior developer, I’ve seen countless developers get stuck on seemingly simple database errors. The error you are encountering—SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel_abonamenty2.currencies' doesn't exist—is one of the most common roadblocks when working with Laravel and Eloquent. It signals a fundamental mismatch between what your application expects in the database structure and what actually exists on the server.

This post will walk you through exactly why this error happens, dissect the potential causes based on your provided code snippets, and show you how to fix it permanently.


The Anatomy of the Error: Eloquent vs. Reality

The error message is straightforward: Laravel (via Eloquent) attempted to query a table named currencies, but the underlying database system could not find a table with that exact name in the specified database schema (laravel_abonamenty2).

When working with Laravel, we rely on Eloquent models to interact with the database. The core issue here is almost always a synchronization problem between your Model definition, your Migration file, and the actual execution of those migrations.

Let's look at the components you provided:

  1. Controller Logic: $currencys = Currency::all(...)
  2. Model: class Currency extends Model
  3. Migration: class Currencys extends Migration { Schema::create('currencys', ...); }

The discrepancy lies in the naming conventions used across these three layers.

Root Cause Analysis: Naming Inconsistencies

In Laravel, there is a strong convention that Eloquent models should map directly to pluralized table names (e.g., the Currency model maps to the currencies table). Your setup shows potential inconsistencies:

  1. Migration Naming: You named your migration Currencys (singular 's' at the end, though it contains an 's'), and inside the up() method, you created the table as 'currencys' (all lowercase).
  2. Model Naming: Your model is Currency. Eloquent typically expects the table name to be the plural version of the model name (currencies).

The SQL error suggests that while your migration might have run, the database schema doesn't recognize the table name as expected by the query generated by Eloquent. This often happens if:
a) The migration was named incorrectly and not properly registered.
b) The actual table name created in the database (currencys) does not match what the Eloquent query is attempting to find (currencies).

The Solution: Aligning Your Database Schema

To resolve this, we need to ensure that your model, migration, and database structure are perfectly synchronized. Follow these steps for a clean fix.

Step 1: Correct the Migration File

Ensure your migration correctly defines the table name as plural, which aligns with Eloquent conventions. If you intend to use the standard pluralization, let's adjust the migration file:

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

class CreateCurrenciesTable extends Migration // Use a descriptive name
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        // Ensure the table name is plural: 'currencies'
        Schema::create('currencies', function (Blueprint $table) {
            $table->id(); // Use id() for auto-incrementing primary key
            $table->string('currency')->nullable();
            $table->string('course')->nullable();
            $table->timestamps();
        });
    }

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

Step 2: Update the Model and Run Migrations

Ensure your model reflects this structure, and then run your database migrations. Remember that managing these relationships effectively is key to building robust applications; for deeper insights into Eloquent capabilities, check out resources like laravelcompany.com.

Your Currency model should remain standard:

php
namespace App;

use Illuminate\Database\Eloquent\Model;

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

    // Define relationships as needed
    public function invoice()
    {
        return $this->belongsTo('App\Invoice');
    }

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

Finally, run your migrations to ensure the database schema matches your code:

bash
php artisan migrate

By making these adjustments, you guarantee that when Eloquent attempts to find the currencies table, it will successfully locate it, resolving the SQLSTATE[42S02] error.

Conclusion

Database errors are often less about complex logic and more about meticulous setup. The Table not found error is a classic symptom of misaligned naming conventions between your Eloquent models and your database migrations. By strictly adhering to Laravel's conventions—ensuring plural table names, correct migration execution, and consistent model definitions—you can eliminate these frustrating issues and focus on building powerful features. Happy coding!