2014-12-01 123 views
0

我有一個相當複雜的用戶架構需求,我想知道在laravel 4中構建模型的最佳方法。我嘗試使用數據透視表,但沒有成功。爲了保密,我每桌只放了幾個字段。Laravel 4 Model雄辯的關係

用戶

  • ID

型材

  • ID
  • 提供商

地址

  • ID
  • COUNTRY_ID
  • 城市

國家

  • ID

公司

  • ID

商店

  • ID

下面是規則:

  1. 用戶可以有多個地址(發貨,開票......)
  2. 用戶可以有多個配置文件(用於社會登錄,在臉書上,谷歌...)
  3. 用戶可以有很多公司(用戶可以擁有多個公司)
  4. 用戶可以有許多商店(用戶可以擁有多個商店)
  5. 檔案可以有一個用戶
  6. 地址可以有一個用戶(一個地址可以被稱爲只有一個用戶)
  7. 地址可以有一個公司(地址可以被稱爲只有一家公司)
  8. 地址可以有一個店
  9. 地址可以有一個國家
  10. 國家可以有多個地址
  11. 公司可以有多個地址(發貨,開票......)
  12. 公司可以有許多商店
  13. 公司可以有很多用戶
  14. 店可以有多個地址(運費,結算...)
  15. 店可以有許多用戶
  16. 店可以有一個公司

我不是尋找「」的答案寫下來,我做模型,但在我看來,邏輯不夠好。例如,這裏的用戶和地址類:

class User extends SentryUserModel implements UserInterface, RemindableInterface { 
    use UserTrait, RemindableTrait; 
    public function addresses() { 
    return $this->hasMany('Address'); 
    } 
} 

class Address extends Eloquent { 
    public function user() { 
    return $this->belongsTo('User'); 
    } 
} 

構建模型以這樣的方式意味着,口才預計在地址表中找到「USER_ID」字段。在我看來,最好使用數據透視表,因爲地址可以屬於用戶,公司和商店,所以在地址表中使用user_id,company_id和shop_id表字段或使用三個數據透視表(user_address, company_address和商店地址)?

數據透視表將爲用戶和公司構建,因爲它是一個多元關係。


我要感謝他,但它的工作原理,如果在用戶級的我用

public function addresses() { 
    return $this->morphMany('Address', 'addressable'); 
} 

,並在地址I類使用

public function addressable() { 
    return $this->morphTo(); 
} 

在這種@MartinBean答案後方式我可以輕鬆打印檢索第一個當前用戶地址

$user->addresses->first()->address 

,並從當前用戶

Address::first()->addressable->email 

的首地址獲取用戶的電子郵件,但你向我指出正確的方向,我認爲,多態關係,只是爲了更好地理解它爲什麼不轉動?你認爲樞軸對用戶 - 公司關係來說是否必要?

+1

你嘗試過這麼遠嗎? Stack Overflow不是讓專業開發人員免費爲你工作的網站。 – 2014-12-01 17:25:28

+0

嗨@MartinBean,閱讀更好的我的問題你是對的,似乎我要求一個工作,但事實並非如此,我寫了一個更新,請回滾投票。謝謝 – poisons 2014-12-01 18:11:23

+0

我製作了'Address'多態,因爲您希望能夠在多個模型中使用地址。對於加入模型 - 就像屬於公司的用戶 - 然後我會使用數據透視表。 – 2014-12-03 16:29:45

回答

0

查看地址,如果您希望它也可用於其他模型,您可能想使用多態關係。這應該是這樣的:

<?php 

class Address extends Eloquent { 

    public function addressable() 
    { 
     return $this->morphTo('addressable'); 
    } 

} 

然後像這樣在你的其他車型:

<?php 

class User extends Eloquent { 

    public function addresses() 
    { 
     return $this->morphMany('Address', 'addresses'); 
    } 

} 

有對多態關係這裏的更多信息:http://laravel.com/docs/4.2/eloquent#polymorphic-relations

+0

感謝@MartinBean,只是一個考慮因素,我更新了帖子 – poisons 2014-12-02 20:23:23