簡體   English   中英

Laravel關系數據庫連接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM