首页 文章

Laravel 4模型雄辩的关系

提问于
浏览
0

我有一个非常复杂的用户架构需求,我想知道在laravel 4中构建模型的最佳方法 . 我尝试使用数据透视表但没有成功 . 为了简洁,我每桌只放了几个字段 .

users

  • id

  • 名字

profiles

  • id

  • 提供者

addresses

  • id

  • country_id

  • city

countries

  • id

  • 名字

companies

  • id

  • 名字

shops

  • id

  • 名字

以下是规则:

  • 用户可以拥有多个地址(运费,结算...)

  • 用户可以拥有多个 Profiles (用于社交登录,在Facebook上,谷歌...)

  • 用户可以拥有多家公司(用户可以拥有多家公司)

  • 用户可以拥有多家商店(用户可以拥有多家商店)

  • Profiles 可以有一个用户

  • 地址可以有一个用户(一个地址只能被一个用户引用)

  • 地址可以有一个公司(地址只能指一家公司)

  • 地址可以有一个商店

  • 地址可以有一个国家/地区

  • 国家/地区可以有多个地址

  • 公司可以有很多地址(运费,账单......)

  • 公司可以有很多商店

  • 公司可以有很多用户

  • 商店可以有很多地址(运费,账单......)

  • 商店可以有很多用户

  • 商店可以有一家公司

我不是在寻找写下的“答案”,我做了模型,但在我看来逻辑不够好 . 例如,这是用户和地址类:

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');
  }
}

以这种方式构建模型意味着Eloquent期望在地址表中找到“user_id”字段 . 在我看来,使用数据透视表应该更好,因为地址可以属于用户,公司和商店,因此最好在地址表中包含user_id,company_id和shop_id表字段或使用三个数据透视表(user_address, company_address和商店地址)?

数据透视表将为用户和公司构建,因为它是一种多人关系 .


在@MartinBean回答之后我想感谢他,但是如果在我使用的User类中它可以工作

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

在我使用的Address类中

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

通过这种方式,我可以轻松打印以检索第一个当前用户地址

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

并从当前用户的第一个地址检索用户电子邮件

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

但你指出我正确的方向,我认为,多态关系,只是为了更好地理解它为什么不转动?你认为枢轴对于用户 - 公司关系来说是必要的吗?

1 回答

  • 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

相关问题