Используйте другое соединение в статической функции Eloquent Model - PullRequest
0 голосов
/ 08 июня 2019

В Laravel 5.8 я пытаюсь установить другое соединение для модели.

У меня настроено 2 подключения к базе данных в config/database.php (mysql1 и mysql2)

Сначала ясделал 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 голосов
/ 08 июня 2019

Я не знаю, почему вы делаете то, что делаете, и почему вы используете 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';
}

Определите staticсвойство внутри FooModel и ссылка на него в MyModel.

0 голосов
/ 08 июня 2019

Использование нескольких соединений с 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;
    }
}

Документы Laravel о нескольких базах данных .

...