2014-12-01 131 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