laravel-如何处理类似类型的模型

laravel-如何处理类似类型的模型,laravel,eloquent,model,Laravel,Eloquent,Model,我试图为一家公司及其相关员工结构建模。我有3个表格(公司、职位、员工),如下所示,公司有多个职位,员工有多个职位。职位属于公司,职位属于员工 然而,不同的位置有一些共同的字段,如船载日期,但有一些字段是不同的。首席执行官有一个保证期,而其他职位则没有。相当多的领域对于不同的位置也是不同的 在这种情况下,我应该使用多态性来建模吗?但由于该公司有相当多的不同职位,这将在数据库中创建相当多的新表 你对如何塑造不同的职位有什么建议吗 公司 身份证 位置 职位 身份证 类型[首席执行官、经理、董事、

我试图为一家公司及其相关员工结构建模。我有3个表格(公司、职位、员工),如下所示,公司有多个职位,员工有多个职位。职位属于公司,职位属于员工

然而,不同的位置有一些共同的字段,如船载日期,但有一些字段是不同的。首席执行官有一个保证期,而其他职位则没有。相当多的领域对于不同的位置也是不同的

在这种情况下,我应该使用多态性来建模吗?但由于该公司有相当多的不同职位,这将在数据库中创建相当多的新表

你对如何塑造不同的职位有什么建议吗

公司

  • 身份证
  • 位置
职位

  • 身份证
  • 类型[首席执行官、经理、董事、职员等]
  • 公司id
  • 雇员身份证
  • 船上日期
  • 终止日期
雇员

  • 身份证
  • 职位id

如果字段与其他表没有关系,一种可能的方法是使用键值表来存储这些字段和值:

position_fields
- id
- position_id
- key
- value
因此,您可以将字段存储在
中,并将相应的值存储在
中。然后您可以在
位置
模型中覆盖
\u get
魔术方法,例如

public function __get($key){
    $position_field = $this->hasMany(PositionField::class)->where('key', $field)->first();
    return !!$position_field ? $position_field->value : $this->getAttribute($key);
}

如果字段与其他表没有关系,一种可能的方法是使用键值表来存储这些字段和值:

position_fields
- id
- position_id
- key
- value
因此,您可以将字段存储在
中,并将相应的值存储在
中。然后您可以在
位置
模型中覆盖
\u get
魔术方法,例如

public function __get($key){
    $position_field = $this->hasMany(PositionField::class)->where('key', $field)->first();
    return !!$position_field ? $position_field->value : $this->getAttribute($key);
}
在这种情况下,我应该使用多态性来建模吗?但由于该公司有相当多的不同职位,这将在数据库中创建相当多的新表

不,为什么会这样

首先,它应该是多个关系,而不是一个公司,因为如果你有两个公司,它们都可以有CEO(例如)职位,如果你设置$position->belongsTo(Company::class);它不能工作

这是一种多形关系,其中
位置
是该三角形的多形角

你需要

// companies
id
name

// employees
id
name

// positions
id
name

// positionables
position_id
positionable_id
positionable_type
有了这个,你的模型就会

class Company extends Model
{
    public function positions()
    {
        return $this->morphToMany(Position::class, 'positionable');
    }
}

class Employee extends Model
{
    public function positions()
    {
        return $this->morphToMany(Position::class, 'positionable');
    }
}

class Position extends Model
{
    public function companies()
    {
        return $this->morphedByMany(Company::class, 'positionable');
    }

    public function employees()
    {
        return $this->morphedByMany(Company::class, 'positionable');
    }
}
它允许您分别设置职位、公司和员工。也就是说,从仪表板上,您可以通过选择选项(比如)在前端创建一些新的位置。当然,您应该允许公司和员工创建新职位(我建议),而不仅仅是使用现有职位,但这可能已经超出了这个问题的范围:例如,公司何时(如果)创建新职位(而不是从选项列表中选择现有职位),您将首先创建该职位并将其存储到
positions
表中,然后将公司与之关联。另外,当使用这种链接输入到DB时,不要忘记使用DB事务。在
positionables
表中,您可以为每个关系设置其他重要字段(
board\u date
stopped\u date
,等等)。 非常好,如果有不清楚的地方,请咨询它(我希望它已经清楚了)

免责声明:我不知道您的项目商业计划的其余部分和项目的其余要求,但对于这三个实体,这是您可以选择的最佳结构。在本例中,我只为模型和表设置了强制成员。同样在提供的答案中,我假设使用了拉威尔的命名约定,这种约定是盲目地遵循文档和回购协议的

在这种情况下,我应该使用多态性来建模吗?但由于该公司有相当多的不同职位,这将在数据库中创建相当多的新表

不,为什么会这样

首先,它应该是多个关系,而不是一个公司,因为如果你有两个公司,它们都可以有CEO(例如)职位,如果你设置$position->belongsTo(Company::class);它不能工作

这是一种多形关系,其中
位置
是该三角形的多形角

你需要

// companies
id
name

// employees
id
name

// positions
id
name

// positionables
position_id
positionable_id
positionable_type
有了这个,你的模型就会

class Company extends Model
{
    public function positions()
    {
        return $this->morphToMany(Position::class, 'positionable');
    }
}

class Employee extends Model
{
    public function positions()
    {
        return $this->morphToMany(Position::class, 'positionable');
    }
}

class Position extends Model
{
    public function companies()
    {
        return $this->morphedByMany(Company::class, 'positionable');
    }

    public function employees()
    {
        return $this->morphedByMany(Company::class, 'positionable');
    }
}
它允许您分别设置职位、公司和员工。也就是说,从仪表板上,您可以通过选择选项(比如)在前端创建一些新的位置。当然,您应该允许公司和员工创建新职位(我建议),而不仅仅是使用现有职位,但这可能已经超出了这个问题的范围:例如,公司何时(如果)创建新职位(而不是从选项列表中选择现有职位),您将首先创建该职位并将其存储到
positions
表中,然后将公司与之关联。另外,当使用这种链接输入到DB时,不要忘记使用DB事务。在
positionables
表中,您可以为每个关系设置其他重要字段(
board\u date
stopped\u date
,等等)。 非常好,如果有不清楚的地方,请咨询它(我希望它已经清楚了)


免责声明:我不知道您的项目商业计划的其余部分和项目的其余要求,但对于这三个实体,这是您可以选择的最佳结构。在本例中,我只为模型和表设置了强制成员。同样在提供的答案中,我假设使用了Laravel的命名约定,这种命名约定盲目地遵循文档和回购协议。

如果有10个不同的职位(如董事、股东、CEO、CFO等),并且每个职位都有5个特定字段,这是否意味着Positables表需要添加50个可空的额外列?如果具有50个可为空的额外列的表存在任何问题?否。然后您为
位置
表创建子属性表,让我们将其命名为
位置_属性
,并使用
$company->positions[0]->attributes来调用它。T