[英]Different db connection for models using hasManyThrough relationship in laravel 5.1
[英]Laravel relationship DB connection
我試圖通過不同的連接獲得模型關系,基本上我的連接是動態的。
$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';
}
所以theoritically當我setConnection
我設置連接擴展這一切車型class
,但仍然沒有運氣。
您可以嘗試eager loading
關系:
$persons = $persons->with('data')->where('somevalue', 1)->get();
我發現一個解決方案可能有問題但工作正常:我在config中創建了一個文件,我添加了所有連接:
<?php
return [
'con1' => [
'name' => 'Persons Connection',
'url' => 'persons',
'active' = true
],
'con2' => [
'name' => 'Italy Persons Connection',
'url' => 'italypersons',
'active' = false
],
];
所以,如果con2可用,我可以控制事件
在數據庫連接配置文件我有con1
在經過與所有DB數據連接routes.php
的URL例如綁定/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函數擴展抽象方法的類Person
<?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
敏感數據
如果有人有更好的想法,請寫下來
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.