2014-02-10 98 views
2

我正在使用Laravel 4.1編寫一個圍繞現有數據庫結構的系統。目前的系統基於兩個網站,這兩個網站使用他們自己的表格ab,兩者都是相同的。在我們重寫其他系統之前,這是一個不可避免的問題。Laravel與多個模型的接口

我需要能夠使用Eloquents查詢生成器同時查詢兩個表,所以我可能需要從任何時候從兩個表或INSERTUPDATE中獲取行的列表。

目前我們有兩個表的模型,但沒有辦法鏈接它們並實施缺失的方法,如allfind

我們的想法是有一個Interface將這些結果綁定在一起,但我們不知道如何去做這件事。

<?php 

    interface HotelInterface { 
     public function all(); 
     public function find(); 
    } 

    use Illuminate\Database\Model; 

    class Hotel implements HotelInterface { 

    } 

?> 

到目前爲止,我們只有這些。

+0

這兩個數據庫在同一臺服務器上嗎? –

+0

@DavidBarker是的,但它們與主要模型的數據庫不同。但這不是問題。 – James

+0

對不起,我沒有試圖指出一個問題......我需要知道是否在同一臺服務器上提出了一個潛在的解決方案。 –

回答

2

我問的Laravel論壇,得到了我一直在尋找的答案擴展它!我在這裏重新發布。

什麼我們實際上追求的是一個Repository這將是這樣的:

<?php 
    class HotelRepository { 
     public $A; 
     public $B; 

     public function __construct(A $A, B $B) { 
      $this->A = $A; 
      $this->B = $B; 
     } 

     public function find($iso = NULL, $hotelid = NULL) { 
      $A = $B = NULL; 

      if($iso !== NULL) { 
       $A = $this->A->where('country', $iso); 
       $B = $this->B->where('country', $iso); 

       if($hotelid !== NULL) { 
        $A = $A->where('id', $hotelid); 
        $B = $B->where('id', $hotelid); 
       } 
      } 

      if($hotelid !== NULL) { 
       if($A->first()) { 
        return $A->first(); 
       } 
       if($B->first()) { 
        return $B->first(); 
       } 
      }else{ 
       return $A->get()->merge($B->get()); 
      } 
     } 

     public function all() { 
      $aCollection = $this->A->all(); 
      $bCollection = $this->B->all(); 
      return $aCollection->merge($bCollection); 
     } 
    } 

現在在哪裏我想打電話給該控制器,我只需要添加:

<?php 
    class HomeController extends BaseController { 
     public function __construct(HotelRepository $hotels) { 
      $this->hotels = $hotels; 
     } 
    } 

我現在可以使用$this->hotels來訪問我創建的findall方法。

0

您可以隨時更改所需的默認數據庫。我使用這個Config::set('database.default', 'chronos');,其中chronos是我的數據庫之一。當我需要更改爲「其他」時,我只需更改數據庫名稱。你可以隨時隨地撥打它。我認爲你正在尋找的只是在數據庫之間切換。

不過,您需要有兩個不同的模型,每個數據庫上的每個表格都有一個模型。

讓我知道如果我弄錯了。

1

如果表格是相同的,你應該只需要一個模型,連接是唯一需要改變的。有一個在這裏讀:http://fideloper.com/laravel-multiple-database-connections

有指定連接一個雄辯方法on(),這裏有一個例子:

能言善辯的例子看起來像你需要什麼:

$results = Model::on('mysql')->find(1); 

添加兩個連接到數據庫的配置,然後改變上()部分取決於您需要查詢的數據庫。

更新:誤解了這個問題

如果你只需要改變的表,而不是數據庫,你可以使用可設置()

$model = new Model 
$model->setTable('b'); 
$model->find(1); 

雖然可能會比較混亂。

相反,你還可以定義一個基礎模型,然後用唯一的區別是表protected $table = 'b';

+0

謝謝,但我沒有使用不同的數據庫。 – James

+0

啊,對不起。你只需要[setTable](https://github.com/laravel/framework/blob/master/src/Illuminate/Database/Eloquent/Model.php#L1737)。 – beech

+0

@詹姆斯我很困惑....是這些還是不是這些在不同的數據庫?現在你說他們只是同一個數據庫中的不同表格? –