Laravel,以一种方法更改模型中的连接?

时间:2018-09-11 14:39:00

标签: php laravel

我有一个开发数据库和一个实时数据库。我需要从实时数据库中返回一些结果,但仅需要此模型中的一种方法。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class TableName extends Model
{
    protected $table = 'table_name';

    protected $connection = 'dev';

    public $timestamps = false;

    public static function live($index) {

        $liveId = Settings::where('index', $index)->get()[0];

        $live = new TableName;

        $live->setConnection('live');

        $data = $live::where('index', $liveId->live_index)->get();

        dd($live);

        return $data;

    }
}

如果我在调用dd()之后$live setConnection变量,那么它确实表示该连接确实是live。但是,一旦我dd() $data,我就会从 dev 数据库获得行!

3 个答案:

答案 0 :(得分:3)

口才提供了一种处理多个连接的好方法。

您应该只能使用on方法。例如。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class TableName extends Model
{
    protected $table = 'table_name';

    protected $connection = 'dev';

    public $timestamps = false;

    public static function live($index) {

        $liveId = Settings::where('index', $index)->get()[0];

        $data = self::on('live')->where('index', $liveId->live_index)->get();

        return $data;

    }
}

然后应该使用数据库配置中的live连接来运行查询。

答案 1 :(得分:0)

您可以尝试通过以下方式获得默认连接:

$defaultConnection = DB::getDefaultConnection();

然后将默认连接更改为从“实时”获取结果之前

DB::setDefaultConnection('live');

然后在不再需要“实时”连接时恢复连接

DB::setDefaultConnection(defaultConnection);

您也可以使用DB::connection('live')来生成数据。有关更多信息,请访问Using Multiple Database Connections

答案 2 :(得分:0)

我个人还没有做过这样的事情,但是我通过执行以下步骤找到了实现此目的的方法。

.env文件中,添加以下新的环境变量=>

DB_CONNECTION_2=mysql
DB_HOST_2=127.0.0.1
DB_PORT_2=3306
DB_DATABASE_2=database2
DB_USERNAME_2=root
DB_PASSWORD_2=secret

现在在config/database.php文件中,使用先前输入的env变量指定第二个mysql连接。

'mysql2' => [
    'driver'    => env('DB_CONNECTION_2'),
    'host'      => env('DB_HOST_2'),
    'port'      => env('DB_PORT_2'),
    'database'  => env('DB_DATABASE_2'),
    'username'  => env('DB_USERNAME_2'),
    'password'  => env('DB_PASSWORD_2'),
],

现在您可以为所需表创建模型=>

class myModel extends Eloquent {

    protected $connection = 'mysql2';

}

然后您可以按常规方式使用它,它将使用控制器方法中的所有Eloquent功能=>

$newMy = new myModel;
$newMy->setConnection('mysql2');
$newMy = $someModel->find(1);
return $something;

Here是您可以阅读有关此内容的文档链接。