2017-01-02 60 views
2

我在兩個不同的數據庫中有兩個表。這兩個數據庫都託管在同一臺AWS RDS服務器上。我有一個用戶帳戶可以訪問這兩個數據庫。 我定義的配置\ database.php中兩種不同的連接:使用Laravel Eloquent在同一臺服務器的不同數據庫中加入兩個MySQL表

return array(
    'default' => 'mysql', 
    'connections' => array(
     # Our primary database connection 
     'mysql' => array(
      'driver' => 'mysql', 
      'host'  => 'samehost', 
      'database' => 'database1', 
      'username' => 'user1', 
      'password' => 'pass1' 
      'charset' => 'utf8', 
      'collation' => 'utf8_unicode_ci', 
      'prefix' => '', 
     ), 
     # Our secondary database connection 
     'mysql2' => array(
      'driver' => 'mysql', 
      'host'  => 'samehost', 
      'database' => 'database2', 
      'username' => 'user2', 
      'password' => 'pass2' 
      'charset' => 'utf8', 
      'collation' => 'utf8_unicode_ci', 
      'prefix' => '', 
     ), 
    ), 
); 

我有兩個模型table1與以database2連接到database1table2的連接。兩個表都有一列id。如何使用Eloquent模型爲具有相同id的行連接查詢?

+0

只是用databaseName.tableName它會工作 –

+0

http://fideloper.com/laravel-multiple-database-connections –

+0

@FazalRasel謝謝,但它沒有談論如何加入表格。 –

回答

4

該解決方案爲我工作:

Model1::where('postID',$postID) 
     ->join('database2.table2 as db2','Model1.id','=','db2.id') 
     ->select(['Model1.*','db2.firstName','db2.lastName']) 
     ->orderBy('score','desc') 
     ->get(); 
2

如果兩個數據庫都在同一連接上並設置爲默認值,則可以用這種方法嘗試。

$query = DB::table('database1.table1 as dt1')->leftjoin('database2.table2 as dt2', 'dt2.ID', '=', 'dt1.ID');   
$output = $query->select(['dt1.*','dt2.*'])->get(); 

我試過在我的本地主機上工作。

+0

謝謝,但您使用了查詢構建器。我問如何用Eloquent模型來做到這一點。 –

+0

@ImanSedighi好的,讓我試試這個。 :) – rahul

+0

我可以從你的答案做出一個加入查詢雄辯的模型,但有一些細微的變化。謝謝 –

1

這很棘手,但可以實現。但是有一些限制,無論如何可能會導致原始解決方案。

這裏有您需要什麼,假設DB1是默認:

,你不能使用前綴爲您的數據庫配置表
// class ModelOne 
public function modelTwo() 
{ 
return $this->hasOne('ModelTwo', 'id'); 
} 

//class ModelTwo 
protected $table = 'db2.model_two_table'; 

public function modelOne() 
{ 
return $this->belongsTo('ModelOne', 'id'); 
} 
// then 
$model1 = ModelOne::with('modelTwo')->get(); 
$model1 = ModelOne::has('modelTwo')->first(); 
// and so on 

心靈。另外,如果您在其中一個模型上定義了非默認連接,則需要爲兩者調整$ table。

您還可以使用各型號不同的連接和許多功能將工作就是這樣,但是你不能依靠加入該雄辯構建:

ModelOne::with('modelTwo')->get(); // works as expected - this is what you asked for 
ModelOne::has('modelTwo')->get(); // error, no table found 
當然

,除非你有相同的模式,但那不是你想要的東西。

+0

它工作正常。在我的數據庫中,真正的列名不是id,我需要在屬於belongsTo和hasOne的第三個參數中添加名稱。 –

0

一個簡單的雄辯的方式不同數據庫的兩個模型連接

class User extends Model { 

    public function Company() 
    { 
    return $this->hasOne(Company::class); 
    } 
} 

class Company extends Model { 
    protected $connection = 'mysql2'; 

    public function User() 
    { 
    return $this->belongsTo(User::class); 
    } 
} 
相關問題