Как в элоквенте выбирать подключения на ходу?

Ну как выбирать понятно, методом on(). Только что делать со связанными моделями?

Есть несколько сайтов с идентичными БД. Не хочется писать под каждый одинаковые модели.

Есть модель, которая связана с другой, для примера товар с категорией:
class Product extends \Model
{
    public function cats()
    {
        return $this->belongsToMany('Cat');
    }
}


Выбрать товар из любой бд:
Product::on($connectionName)->find($productId);

Это получается, а вот выбрать связанные категории:
Product::on($connectionName)->find($productId)->cats();

не получается - модель Cat работает на дефолтном подключении.

Как сделать так чтобы связанные модели срабатывали на том же подключении, на котором была запущена "основная"?
  • Вопрос задан
  • 2610 просмотров
Пригласить эксперта
Ответы на вопрос 2
65536
@65536 Автор вопроса
Если кому вдруг интересно, решил следующим образом. В самом элоквенте такой возможности нет, поэтому пришлось накостылить. Вообще логично, что если я указал для модели соединение, то и связи должны браться с того же соединения, а не с дефолтного. Не могут же быть таблицы одной бд связаны с таблицами другой (причем дефолтной, указать то нельзя)

Вот что пришлось добавить (4-й элоквент):
1.
public function newQuery()
{
    // + вот это {
    list(, $caller) = debug_backtrace(true, 2);

    $connection = null;
    if ( isset($caller['object']) && $caller['object'] instanceof self)
        $connection = $caller['object']->connection;
    // }

    $builder = $this->newEloquentBuilder(
        $this->newBaseQueryBuilder($connection) // + аргумент $connection
    );

    $builder->setModel($this)->with($this->with);

    return $this->applyGlobalScopes($builder);
}

2.
protected function newBaseQueryBuilder($connection = null) // + аргумент
{
    $conn = $this->getConnection($connection); // + аргумент

    $grammar = $conn->getQueryGrammar();

    return new QueryBuilder($conn, $grammar, $conn->getPostProcessor());
}

3.
public function getConnection($connection = null) // + аргумент
{
    // + вот это {
    if ( $connection )
        $this->setConnection($connection);
    // }

    return static::resolveConnection($this->connection);
}


Всё работает, теоретически нигде не должны мешать эти добавления
Ответ написан
Комментировать
ghost404
@ghost404
PHP Developer
Не понял о чем вы и о каком фреймворке идет речь

на вскидку
class Product extends \Model
{
    public function getCategory()
    {
        return $this->getDbConnection('connection_second')
            ->getModel('Category')
            ->find($this->cat_id);
    }
}

получние категории продукта
Product::on('connection_first')->find($product_id)->getCategory();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы