首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >拉勒维尔雄辩地热切地加载着另一种连接

拉勒维尔雄辩地热切地加载着另一种连接
EN

Stack Overflow用户
提问于 2015-02-09 19:18:06
回答 5查看 3.3K关注 0票数 2

我试图用Laravel雄辩的ORM在两种不同的联系上做一个简单的一对一的关系。

让我这么说吧:

代码语言:javascript
运行
复制
MyModel::on('secondary_connection')->get()

效果很好。

当我这么做时:

代码语言:javascript
运行
复制
MyModel::on('secondary_connection')->with('AnotherModel')->get();

我得到了一个错误,因为雄辩是在默认连接上执行AnotherModel SELECT语句(而不是"secondary_connection")。

我找不到解决这个问题的办法。

我的模型是很好的定义,因为我可以加入他们在我的默认连接。

思想?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-02-10 19:18:36

嗯,正如许多用户所建议的那样,似乎没有办法在飞行中做到这一点。我对此的理解是,当涉及到管理多个连接时,雄辩是不完整的。

我想有两种方法可以解决这个问题。

首先,在模型中指定连接:

代码语言:javascript
运行
复制
class MyModel {
    $protected connection = 'secondary_connection';
}

这显然是一个糟糕的解决办法,因为这个模型只能在一个连接中使用.但仍然有效。

然后,正如Jarek所建议的那样,可以使用新的连接来切换default连接。但是,与其在配置文件中执行此操作,还可以交换PDO对象。

代码语言:javascript
运行
复制
    $default = DB::getPdo(); // Default conn
    $secondary = DB::connection('secondary_connection')->getPdo();
    DB::setPdo($secondary);
    $result = MyModel::with('AnotherModel')->get();
    DB::setPdo($default);

这是一个可行的解决办法,可以是一个干净的解决方案。下一步是把开关机构在一个很好的拉拉维尔方式。

票数 3
EN

Stack Overflow用户

发布于 2015-02-09 23:48:58

根本没有办法在飞行中做到这一点。

您需要更改默认连接,以便将其雄辩地用于渴望加载的模型。您可以将它包装在下面这样的帮助器方法中:

代码语言:javascript
运行
复制
function on($connection, Closure $callback)
{
    // backup default connection
    $default = Config::get('database.default');

    // change for current query
    Config::set('database.default', $connection);

    // run the query
    $result = $callback();

    // restore the default connection
    Config::set('database.default', $default);

    return $result;
}

然后打个电话,如下所示:

代码语言:javascript
运行
复制
$models = on('secondary_connection', function () {
   return MyModel::with('relation')->get();
});
票数 0
EN

Stack Overflow用户

发布于 2015-09-18 12:51:49

最后,我将简单的关系函数替换为更多的自定义函数。例如,我的->relatedModel在某种程度上是雄辩模型中原始版本的副本,但包括设置连接:

代码语言:javascript
运行
复制
public function relatedModel() {
  $instance = new \relatedModel;
  $instance->setConnection($this->getConnectionName());
  $query = $instance->newQuery();

  return new BelongsTo($query, $this, 'myForeignKey', $instance->getKeyName(), null);
}

我在拉拉维尔5号,所以这可能和4.2不一样。

由于我在处理这个问题,所以这里有一种很好的方法来完成对另一个连接的验证,而不是默认的连接:http://laravel.io/forum/10-29-2014-validation-rules-and-multiple-db-connections

如果它是一个模型方法,您甚至可以将其缩短为:

代码语言:javascript
运行
复制
$v = Validator::make($data, $rules);
$v->getPresenceVerifier()->setConnection($this->getConnectionName());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28417546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档