在Eloquent模型的静态函数中使用其他连接

时间:2019-06-07 23:03:23

标签: php laravel eloquent laravel-5.8

在Laravel 5.8中,我尝试为模型设置不同的连接。

我在config/database.phpmysql1mysql2)中建立了2个数据库连接

首先,我参加了MyModel课:

  namespace App\Models;

  class MyModel
  extends \Illuminate\Database\Eloquent\Model {
    public static function sqlselect($sql) {
      $result = DB::select(DB::raw($sql));
      return $result;
    }
  }

然后,我从该类派生了一个新模型,并设置了它应使用的连接:

namespace App\Models;

class FooModel extends \App\Models\MyModel {
  protected $connection = 'mysql2';

}

当我尝试使用此FooModel时,我希望它使用mysql2连接,但不会。

use App\Models\FooModel;
$sqlresult = FooModel::sqlselect('SELECT * FROM foo');

给出一个错误,指出foo表不在数据库中,因为它仍然尝试使用默认的mysql1连接。

在保持所有内容不变的情况下执行此操作的任何方法吗?

2 个答案:

答案 0 :(得分:0)

使用与laravel的多个连接:

查询生成器

$queryResult = DB::connection('mysql2')->select(...);

雄辩:

class MyModel extends Model {
    protected $connection = 'mysql2';
}

您还可以定义运行时使用的connection

class MyController extends Controller {

    public function myMethod()
    {
        $myModel = new MyModel;

        $myModel->setConnection('mysql2'); // non-static method

        $queryResult = $myModel->find(1);

        $queryResult = MyModel::on('mysql2')->find(1); // static method

        return $queryResult;
    }
}

有关multiple database的Laravel文档。

答案 1 :(得分:0)

我不知道您为什么要做自己的工作,也不知道为什么要使用Eloquent而不是class MyModel extends Model { public static function sqlselect($sql) { return DB::connection(static::$conn)->select(DB::raw($sql)); } } ,但是:

class FooModel extends MyModel
{
    protected $connection = 'mysql2';
    protected static $conn = 'mysql2';
}
static

FooModel内定义一个MyModel属性,并在{{1}}中引用该属性。