我试图通过不同的连接获得模型关系,基本上我的连接是动态的。
$con = 'con1'
$persons = new \App\Models\Person;
$persons->setConnection($con);
$persons = $persons->where('somevalue', 1)->get()
所以在这里我从con1获取Person(其中con1存储在config / databse.php中 它可以是con2,con3,con4等。
然而这是有效的,但是当我试图遍历这些数据并获得关系时,它会切换到默认的数据库连接。
@foreach($persons as $person)
{{$person->data->name}}
@endforeach
在上面的循环data
是Person Model中的belongsTo关系,它会抛出错误,因为它切换回默认的数据库连接而不是使用con1
It is possible to setConnection() and keep for hasMany relationship and also for belongsTo relationship?
我无法在模型中设置protected $connection;
因为连接有变化
我到现在为止尝试的是创建了一个扩展的扩展类,我的模型扩展了这个抽象类
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as Eloquent;
abstract class Database extends Eloquent {
protected $connection;
}
<?php
namespace App\Models;
use App\Models\Database as Database;
class Person extends Database{
protected $table = 'persons';
}
所以理论上当我setConnection
时,我设置了与所有扩展此class
但仍然没有运气的模型的连接。
答案 0 :(得分:1)
您可以尝试eager loading
关系:
$persons = $persons->with('data')->where('somevalue', 1)->get();
答案 1 :(得分:0)
我发现解决方案可能有问题但工作正常: 我在config中创建了一个文件,我添加了所有连接:
<?php
return [
'con1' => [
'name' => 'Persons Connection',
'url' => 'persons',
'active' = true
],
'con2' => [
'name' => 'Italy Persons Connection',
'url' => 'italypersons',
'active' = false
],
];
因此,如果con2可用,我可以控制事件
在数据库连接配置文件中,我与所有数据库数据都有con1
连接
在routes.php
之后绑定网址示例/info/{con}
where con = 'persons'
Route::bind('con', function($con, $route){
foreach(config('connections') as $key => $value){
if($value['url'] == $con && $value['active'] == true){
session(['connection' => $key]); //where $key == con1
return $key;
}
abort(404);
}
});
所以:我有一个使用__construct函数扩展抽象方法的类人员
<?php
namespace App\Models;
use App\Models\Database as Database;
class Person extends Eloquent{
protected $table = 'persons';
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as Eloquent;
abstract class Database extends Eloquent {
function __construct(array $attributes = array())
{
parent::__construct($attributes);
$this->setConnection(session('connection'));
}
}
因此,我确定用户是否可以访问URL /info/{con}
如果连接会话存在于我的连接配置文件中,它将设置连接会话,而不会丢失来自config/database.php
的敏感数据
如果有人有更好的主意,请写下来