2015-04-07 52 views
0

我有一個模型(客戶端)與另一個有多種關係(Client_option)。Larevel/Eloquent有很多沒有外鍵的關係

這兩個表位於不同的數據庫中(所以有一個客戶端列表,然後每個客戶端都有自己的數據庫和一個選項表)。

在我的客戶端類中,我希望我的options()方法返回選項表的全部內容(它知道要查找哪個客戶端數據庫)。因爲它是我得到一個錯誤,因爲選項表中不存在列client_id。我當然可以創建該列,並用客戶端ID填充每一行,但我只是爲了保持雄辯愉快而避免這種小混亂。

在此先感謝您的任何意見!

傑夫

回答

3

這將允許你使用它作爲一個關係,稱其爲動態屬性$user->options,批量保存與push方法等:

public function options() 
{ 
    // it will use the same connection as user model 
    $options = ClientOption::on($this->getConnectionName())->get(); 

    // if options model has its own, then simply 
    // $options = ClientOption::get(); 

    $this->setRelation('options', $options); 

    return $options; 
} 

public function getOptionsAttribute() 
{ 
    return (array_key_exists('options', $this->relations)) 

    // get options from the relation, if already loaded 
    ? $this->getRelation('options') 

    // otherwise call the method and load the options 
    : $this->options(); 
} 
+0

這個作品真的很好,描述,但當我嘗試加載選項關係時,我確實收到錯誤,如下所示:Client :: with('options') - > find($ client_id);我收到錯誤「調用未定義的方法App \ Models \ Base \ Custom_collection :: addEagerConstraints()」(Custom_collection extends Collection)。我試着讓options()方法返回$ this-> getRelation('options')而不是$ options,但沒有快樂。有什麼想法嗎?很高興與您的答案,並將標記爲正確的任何一種方式。謝謝! –

+0

這是一個僞關係。也就是說,你不能依靠雄辯的所有關係特徵,渴望加載成爲其中之一。 –