【问题标题】:Use a different connection in a static function of Eloquent Model在 Eloquent 模型的静态函数中使用不同的连接
【发布时间】:2019-06-07 23:03:23
【问题描述】:

在 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 连接。

有什么方法可以做到这一点,同时仍然保持一切静止?

【问题讨论】:

  • DB 不会自动在 Model 中使用连接,如果需要,只需使用 Model 执行查询

标签: php laravel eloquent laravel-5.8


【解决方案1】:

通过 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 文档。

【讨论】:

  • 谢谢。我已经阅读了所有这些内容,但是由于 MyModel 是一个不应该设置连接的抽象类,因此这不是正确的方法。并且在控制器中设置它也不是一种选择,因为我也想在路由之外使用模型。 static::$connection 在 MyModel 中也不可用,所以我也不能使用它。
【解决方案2】:

我不知道你为什么要做你正在做的事情,也不知道你为什么使用DB而不是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';
}

FooModel 中定义一个static 属性并在MyModel 中引用它。

【讨论】:

  • 我已经想出了相同的解决方案,但我认为必须两次定义连接是相当难看的。我正在使用 DB,因为 Eloquent 无法完成完整的原始查询(或者可以吗?)
猜你喜欢
  • 1970-01-01
  • 2020-10-16
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2016-07-19
  • 1970-01-01
相关资源
最近更新 更多