Laravel关系数据库连接

时间:2015-11-19 20:04:50

标签: php mysql database laravel eloquent

我试图通过不同的连接获得模型关系,基本上我的连接是动态的。

$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但仍然没有运气的模型的连接。

2 个答案:

答案 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的敏感数据

如果有人有更好的主意,请写下来