我有一个非常复杂的用户架构需求,我想知道在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 回答
查看地址,如果您希望它也可用于其他模型,您可能希望使用多态关系 . 这看起来像这样:
然后在你的其他型号中这样:
这里有关于多态关系的更多信息:http://laravel.com/docs/4.2/eloquent#polymorphic-relations