【发布时间】:2019-12-20 05:43:54
【问题描述】:
我最近接手了一个拥有现有用户系统的项目(标准 Laravel 5.7 make:auth 设置)。我已经确定的是,由于系统中用户类型的不同,用户表中有大量的 MySQL 数据库列是空白或 NULL。出于本示例的目的,假设他们是管理员、父母、儿童。但在当前的应用程序中,除了一个名为“type”的列之外,没有明确的区别用户是什么,对于孩子来说是 NULL,对于 ADMINISTRATOR 是 'admin',对于 PARENTS 是 'parent'。
我希望能够将所有这些列分开以与适当的用户类型相关联,同时保持相同的身份验证方法(这是我目前的思考过程,不是一成不变的)。
根据我收集到的信息,我应该研究一种多态关系,其中用户模型与每个用户类型都具有“可类型化”的变形关系。我还读到这需要在用户模型上有一个“typeable_type”和“typeable_id”列,其中“type”指的是模型——在这种情况下是“App\Models\Admin”、“App\Models\Parent”, “应用\模型\儿童”。
对于其中的每一个,我都会做这样的事情:
class User extends Model
{
public function typeable()
{
return $this->morphTo();
}
}
class Admin extends Model
{
public function user()
{
return $this->morphMany('App\User', 'typeable');
}
}
class Parent extends Model
{
public function user()
{
return $this->morphMany('App\User', 'typeable');
}
}
class Child extends Model
{
public function user()
{
return $this->morphMany('App\User', 'typeable');
}
}
我的问题是 - 我如何在“类型”类中创建可以使用父用户 ID 作为任何关系的外键/基础的关系?
例如,Parent 可能在数据库中有订阅,而 Admin 可能没有。订阅表通过“user_id”列引用当前用户。
传统上,用户只是通过正常关系引用订阅。
class User extends Model
{
public function subscription()
{
return $this->hasOne(App\Models\Subscription::class);
}
}
class User extends Model
{
public function subscription()
{
return $this->hasMany(App\Models\User::class);
}
}
如何在“父”类拥有该关系的架构中检索它。请记住,我正在使用我继承的旧版应用程序,因此目前所有内容都围绕用户和 user_id。
长话短说,我希望能够根据用户类型提取不同类型的信息,但仍将每种用户类型视为传统意义上的“用户”。一个理想的系统是每个用户类型拥有的信息被“扁平化”到标准用户中以供使用。
【问题讨论】:
标签: mysql laravel eloquent eloquent-relationship