2015-11-19 78 views
3

我试图让使用不同的连接模式的关系,基本上我的连接是动态的。Laravel关系数据库连接

$con = 'con1' 
$persons = new \App\Models\Person; 
$persons->setConnection($con); 
$persons = $persons->where('somevalue', 1)->get() 

所以在这里我得到的人从CON1(其中con 1的存储在配置/ databse.php 它可以是CON2,CON3,CON4等

但是这个工作,但是当我试图通过这个数据环路,并得到关系切换到默认的数据库连接。

@foreach($persons as $person) 
    {{$person->data->name}} 
@endforeach 

在上面的循环data是在角色模型一个属于关联关系的船,因为它切换回默认的数据库连接的,它抛出错误□不使用CON1

It is possible to setConnection() and keep for hasMany relationship and also for belongsTo relationship?

我不能设置protected $connection;的模型,因为连接是changble

我试过直到现在我创建了一个absctract类extendseloquent,和我的模型扩展这个抽象类

<?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但仍然没有运气。

+0

它不能这样做,因为它试图加入这些表。没有办法在不同的连接上连接表。 – user3158900

+0

@ user3158900 Laravel关系不使用连接。理论上这是可能的,但是代码是否允许它仍然需要一些研究。 – patricus

回答

0

我找到了解决办法也许错了,但工作: 我创建配置文件,我加我的所有连接:

<?php 
return [ 
    'con1' => [ 
     'name' => 'Persons Connection', 
     'url' => 'persons', 
     'active' = true 

    ], 
    'con2' => [ 
     'name' => 'Italy Persons Connection', 
     'url' => 'italypersons', 
     'active' = false 

    ], 
]; 

我所以这样我可以控制的事件如果CON2可用

在数据库连接配置文件与所有数据库con1连接数据 在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功能

<?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

如果有人有更好的想法,请把它写

1

您可以尝试的关系eager loading

$persons = $persons->with('data')->where('somevalue', 1)->get(); 
+1

我会觉得这样的作品。如果没有,我没有别的办法可以想到。 Froxz应该试试这个。我有一种感觉,它可能仍然运行默认连接上的热切查询。 – Trip

+1

我之前试过,它不起作用 – Froxz

+1

更新我的问题 – Froxz