Laravel

Laravel TutorialChange default routing behaviour in Laravel 5.2.31 +CustomException class in LaravelDeploy Laravel 5 App on Shared Hosting on Linux ServerLaravel ArtisanLaravel AuthenticationLaravel AuthorizationLaravel Blade TemplatesLaravel CashierLaravel CollectionsLaravel Common Issues & Quick FixesLaravel ConstantsLaravel ControllersLaravel Cron basicsLaravel Cross Domain RequestLaravel Custom Helper functionLaravel DatabaseLaravel Database MigrationsLaravel Database SeedingLaravel Directory StructureLaravel DockerLaravel EloquentLaravel Eloquent : RelationshipLaravel Eloquent: Accessors & MutatorsLaravel Eloquent: ModelLaravel Error HandlingLaravel Events and ListenersLaravel Filesystem / Cloud StorageLaravel Form Request(s)Laravel Getting started with laravel-5.3Laravel HelpersLaravel HTML and Form BuilderLaravel InstallationLaravel Installation GuideLaravel Introduction to laravel-5.2Laravel Introduction to laravel-5.3Laravel lumen frameworkLaravel Macros in Eloquent RelationshipLaravel MailLaravel MiddlewareLaravel ObserverLaravel PackagesLaravel PaginationLaravel Permissions for storageLaravel PoliciesLaravel QueuesLaravel RequestsLaravel Route Model BindingLaravel RoutingLaravel SeedingLaravel ServicesLaravel SocialiteLaravel Task SchedulingLaravel TestingLaravel Token Mismatch Error in AJAXLaravel use fields aliases in EloquentLaravel Useful linksLaravel ValetLaravel ValidationMultiple DB Connections in LaravelNaming Files when uploading with Laravel on WindowsRemove public from URL in laravelSparkpost integration with Laravel 5.4



Laravel Database

From WikiOD

Multiple database connections[edit | edit source]

Laravel allows user work on multiple database connections. If you need to connect to multiple databases and make them work together, you are beware of the connection setup.

You also allow using different types of database in the same application if you required.

Default connection In config/database.php, you can see the configuration item call:

'default' => env('DB_CONNECTION', 'mysql'),

This name references the connections' name mysql below:

'connections' => [

    'sqlite' => [
        'driver' => 'sqlite',
        'database' =>  database_path('database.sqlite'),
        'prefix' => '',
    ],

    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,
    ],
],

If you did not mention the name of database connection in other codes or commands, Laravel will pick up the default database connection name. however, in multiple database connections, even you setup the default connection, you've better setup everywhere which database connection you used.

Migration file

In migration file, if single database connection, you can use:

 Schema::create("table",function(Blueprint $table){
     $table->increments('id');
});

In multiple database connection, you will use the connection() method to tell Laravel which database connection you use:

 Schema::connection("sqlite")->create("table",function(Blueprint $table){
     $table->increments('id');
});

Artisan Migrate

if you use single database connection, you will run:

php artisan migrate

However, for multiple database connection, you've better tell which database connection maintains the migration data. so you will run the following command:

php artisan migrate:install --database=sqlite

This command will install migration table in the target database to prepare migration.

php artisan migrate --database=sqlite

This command will run migration and save the migration data in the target database

php artisan migrate:rollback --database=sqlite

This command will rollback migration and save the migration data in the target database

Eloquent Model

To specify a database connection using Eloquent, you need to define the $connection property:

namespace App\Model\Sqlite;
class Table extends Model
{
    protected $table="table";
    protected $connection = 'sqlite';
}

To specify another ( second ) database connection using Eloquent:

namespace App\Model\MySql;
class Table extends Model
{
    protected $table="table";
    protected $connection = 'mysql';
}

Laravel will use $connection property defined in a model to utilize the specified connection defined in config/database.php. If the $connection property is not defined in a model the default will be used.

You may also specify another connection using the static on method:

// Using the sqlite connection
Table::on('sqlite')->select(...)->get()
// Using the mysql connection
Table::on('mysql')->select(...)->get()

Database/Query Builder

You may also specify another connection using the query builder:

// Using the sqlite connection
DB::connection('sqlite')->table('table')->select(...)->get()
// Using the mysql connection
DB::connection('mysql')*>table('table')*>select(...)*>get()

Unit Test

Laravel provide seeInDatabase($table,$fielsArray,$connection) to test database connection code. In Unit test file, you need to do like:

$this
    ->json(
        'GET',
        'result1/2015-05-08/2015-08-08/a/123'
    )
     ->seeInDatabase("log", ["field"=>"value"], 'sqlite');

In this way, Laravel will know which database connection to test.

Database Transactions in Unit Test

Laravel allows database to rollback all the change during the tests. For testing multiple database connections, you need to set $connectionsToTransact properties

use Illuminate\Foundation\Testing\DatabaseMigrations;

class ExampleTest extends TestCase
{
     use DatabaseTransactions;

     $connectionsToTransact =["mysql","sqlite"] //tell Laravel which database need to rollBack

    public function testExampleIndex()
    {
        $this->visit('/action/parameter')
         ->see('items');
    }
}

Credit:Stack_Overflow_Documentation