【问题标题】:Laravel relationship DB connectionLaravel 关系数据库连接
【发布时间】:2016-02-22 03:42:39
【问题描述】:

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

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

【问题讨论】:

  • 无法完成,因为它正在尝试加入这些表。无法在不同的连接上连接表。
  • @user3158900 Laravel 关系不使用连接。理论上这是可能的,但代码是否允许还需要研究。

标签: php mysql database laravel eloquent


【解决方案1】:

你可以试试eager loading的关系:

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

【讨论】:

  • 我认为这行得通。如果没有,我想不出别的了。 Froxz 应该试一试。我感觉它可能仍会在默认连接上运行急切加载查询。
【解决方案2】:

我发现一个解决方案可能是错误的,但正在运行: 我在 config 中创建一个文件,在其中添加所有连接:

<?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);      
        }
    });

所以:我有一个类 Person,它使用 __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 的敏感数据

如果有人有更好的想法,请写出来

【讨论】:

    猜你喜欢
    • 2013-05-23
    • 2020-05-11
    • 2015-02-07
    • 2011-10-16
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多