Laravel关系型数据库连接

3

我正在尝试在不同的连接中建立模型关系,基本上我的连接是动态的。

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

所以在这里,我从config/database.php中获取了Person的con1(可以是con2、con3、con4等)。

然而,当我尝试循环遍历此数据并获取关系时,它会切换到默认的数据库连接。

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

在上面的循环中,data是Person Model中的belongsTo关系。由于它切换回默认数据库连接而不使用con1,因此会出现错误。

是否可以为hasMany和belongsTo关系都设置setConnection()呢?

我不能在Model中设置protected $connection;,因为连接是可变的

到目前为止,我尝试创建了一个继承eloquent的抽象类,并使我的模型扩展了这个抽象类。

<?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 的模型中,但是还没有成功。


无法完成,因为它正在尝试连接这些表。没有办法在不同的连接上连接表。 - user1669496
@user3158900 Laravel关系不使用连接。理论上这是可能的,但代码是否允许仍需要一些研究。 - patricus
2个回答

1
您可以尝试关系的急加载
$persons = $persons->with('data')->where('somevalue', 1)->get();

1
我认为这应该可以工作。如果不行,我想不出其他办法了。Froxz应该试一试。我有一种感觉,它可能仍然在默认连接上运行急切加载查询。 - Trip
当在关系中使用不同的连接时,这对我不起作用。with() 方法假定 PersonData 使用相同的连接。 - Pathros

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},其中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中的敏感数据。

如果有更好的想法,请写下来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接