2013-06-19 35 views
3

我將在一個將使用EAV結構存儲對象數據的系統上工作。模型本身將有一些預先定義的屬性(座標和日期/時間戳),即:Eloquent ORM和EAV

  • X
  • ý
  • Ž
  • 開始日期/時間
  • 結束日期/時間

其餘屬性將由用戶動態創建,並添加爲屬性表中的行。這些行將被旋轉並作爲列與值表對齊(不確定這是否需要解釋,但認爲安全性比抱歉更好)。

屬性關係的對象(或實體)是一對多的。

屬性與值之間的關係是一對多關係。

我是Eloquent/Laravel的新手,但我已經通讀了關係文檔,發現有一對多關係的功能,但是,我不清楚我如何引用EAV中的所有數據更關注RDBMS)。會不會是這樣的(請記住這是一個粗略的例子)?

class UserObject extends Eloquent { 

    public function object_data() 
    { 
     return $this->hasMany(attributes_data); 
    } 

    public function attributes_data() 
    { 
     return $this->hasMany('Values'); 
    } 

} 

基本上,我的問題是:

是否有設計/檢索與EAV相關聯的所有數據寫入時的模型的接受(或正確)的做法?如果是這樣,你能指點我一些關於Eloquent/EAV方法的文檔或教程嗎?

的幾點思考後:

我的想法是,我需要爲EAV的每個組件創建3類(即一個用於實體組件的數據,一個用於屬性的數據,一個用於值的數據)。

謝謝。

回答

6

有可以做,去了解這個(因爲我已經通過其他論壇的帖子發現)的幾個方法:

爲每個EAV元件,如模型僞代碼:

class Object extends Eloquent{ 
    public function objects(){ 
     return $this->hasMany('Attribute'); 
    } 
} 

class Attribute extends Eloquent{ 
    public function attributes(){ 
     return $this->hasMany('Value'); 
    } 
} 

class Value extends Eloquent{ 
    public function values(){ 
     return /* etc. */; 
    } 
} 

這將導致性能的下降,因爲將只執行檢索值數據3次的查詢。

使用查詢生成器

選擇() - >連接() - >在哪裏( 「屬性」, 「=」, 「東西」)

這也將導致性能的下降。

Laravel的DB功能

基本上運行SQL查詢直接可能會導致開銷最少的,例如,從Laravel網站:

$results = DB::select('select * from users where id = ?', array(1)); 

旁註:

對於這種系統(其中屬性是動態的和未知的),最好避免完全使用EAV,並堅持使用無SQL解決方案,其中w與Laravel一起工作會更直觀。我已經考慮過這個選擇,並且將會長期與此相關。

+0

嘿,你能解釋一下關於NO SQL解決方案嗎?因爲我也有相同的情況和想用我的數據庫使用EAV! 我會有公司,他們的功能都是使用EAV綁定的。類似的搜索標籤,類別等 – harishannam

+0

沒有SQL?我還想了解更多信息...... –

+1

@MikelBitson'No SQL'中,quandrei必須意味着像'MongoDB'這樣的解決方案,但是也可以使用mySQL中的JSON編碼列。 –