How to use global prefix for tables in Laravel 5
Asked Answered
U

4

10

New in Laravel. Probably a silly question. I had setup database like this:

'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => 'mydb',
        'username' => 'myusername',
        'password' => 'mypassword',
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => 'admin',
        'strict' => false,
        'engine' => null,
    ],

Notice 'prefix' => 'admin'. This is because I want all tables related to the website's control panel be prefixed with admin, e.g: admin_users, admin_log, etc...

But I'm stuck at the very beginning. I'm trying to create migrations via artisan but it's not creating the tables with the prefix.

php artisan make:migration create_users_table --create=users

I'm expecting that to create a table named admin_users. But it's not.

Am I doing this right?

Underpart answered 1/6, 2016 at 4:2 Comment(0)
R
20

Laravel caches config files, so you may simply need to clear the cache:

php artisan config:clear

In addition to this, a better practice is to use the .env file to define your prefix, like this:

...
DB_PREFIX=admin_
...

and loading that in your config file, like this:

'prefix' => env('DB_PREFIX', 'abc')

This is how it should have been by default.

You're already loading the hostname and port from the .env file, so why not do it for the other values as well?

Ralline answered 11/7, 2018 at 6:44 Comment(1)
You are awesome, saved my life, a big thanks Aalaap :)Pram
S
0

The migrations will be created without a prefix. After running php artisan migrate you should see tables with prefixes

Stomatitis answered 1/6, 2016 at 4:12 Comment(0)
P
0

Prefix does not includes underscore (_) by itself. In order to create admin_users You have to use admin_ prefix.
When generating migrations You will get plain table names, without prefixes.

With prefix = 'admin_'; this: Schema::create('users', function (Blueprint $table) {<...>}); will result in creation of admin_users table, because Laravel adding Your prefix under the hood by default.


TL;DR

Even though Your scheme displays table name without prefix, Laravel will create it with prefix.

Presidio answered 1/6, 2016 at 4:13 Comment(0)
A
0

You should use Schema::connection($name) method to apply the connection to the schema builder.

For some reason if you just set connection property - migration uses this connection to run queries but wont uses it during schema building.

The following is the migration code example that uses custom connection to create foo table:

<?php

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

class CreateFoo extends Migration
{
    protected $connection = 'custom';

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::connection($this->connection)->create('foo', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::connection($this->connection)->dropIfExists('foo');
    }
}

This code is tested in real app and works perfectly.

Laravel version: 8.40

Archaeopteryx answered 27/7, 2021 at 12:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.