我试图用Laravel雄辩的ORM在两种不同的联系上做一个简单的一对一的关系。
让我这么说吧:
MyModel::on('secondary_connection')->get()效果很好。
当我这么做时:
MyModel::on('secondary_connection')->with('AnotherModel')->get();我得到了一个错误,因为雄辩是在默认连接上执行AnotherModel SELECT语句(而不是"secondary_connection")。
我找不到解决这个问题的办法。
我的模型是很好的定义,因为我可以加入他们在我的默认连接。
思想?
发布于 2015-02-10 19:18:36
嗯,正如许多用户所建议的那样,似乎没有办法在飞行中做到这一点。我对此的理解是,当涉及到管理多个连接时,雄辩是不完整的。
我想有两种方法可以解决这个问题。
首先,在模型中指定连接:
class MyModel {
$protected connection = 'secondary_connection';
}这显然是一个糟糕的解决办法,因为这个模型只能在一个连接中使用.但仍然有效。
然后,正如Jarek所建议的那样,可以使用新的连接来切换default连接。但是,与其在配置文件中执行此操作,还可以交换PDO对象。
$default = DB::getPdo(); // Default conn
$secondary = DB::connection('secondary_connection')->getPdo();
DB::setPdo($secondary);
$result = MyModel::with('AnotherModel')->get();
DB::setPdo($default);这是一个可行的解决办法,可以是一个干净的解决方案。下一步是把开关机构在一个很好的拉拉维尔方式。
发布于 2015-02-09 23:48:58
根本没有办法在飞行中做到这一点。
您需要更改默认连接,以便将其雄辩地用于渴望加载的模型。您可以将它包装在下面这样的帮助器方法中:
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;
}然后打个电话,如下所示:
$models = on('secondary_connection', function () {
return MyModel::with('relation')->get();
});发布于 2015-09-18 12:51:49
最后,我将简单的关系函数替换为更多的自定义函数。例如,我的->relatedModel在某种程度上是雄辩模型中原始版本的副本,但包括设置连接:
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。
如果它是一个模型方法,您甚至可以将其缩短为:
$v = Validator::make($data, $rules);
$v->getPresenceVerifier()->setConnection($this->getConnectionName());https://stackoverflow.com/questions/28417546
复制相似问题