为扩展模型修改数据库
Modify database for extended models
我有这种情况:
我有 Person
的 table(称为 persons
)。一个人有一个名字、一个 ID 和一个类型(自然的或法人的)。
然后我有Organization
,它当然是一个扩展了Person
的法人,并且有manager_id
或employees
这样的特定字段。
然后我有一个 Authority
这是一个特殊的政府 Organization
,所以最后也是一个 Person
并且还有像 decree_number
这样的特殊必填字段(数字和年份构成 Authority
) 的法令。
然后我有我的数据库,其中有一个名为 persons
的 table。
我的问题是:我应该为 organizations
创建一个新的 table,然后为 authorities
创建另一个吗?如果不是,我应该如何存储当局或组织所需的新字段而不是个人所需的新字段?
我在一个 Laravel 项目中这样做,我可以:
/* Person.php */
class Person extends Model {
}
/* Organization.php */
class Organization extends Person {
protected $table = 'persons';
}
/* Authority.php */
class Authority extends Organization {
protected $table = 'persons';
}
是的,创建另一个 table,但不要重复 persons
已有的数据,您可以为此使用关系。
例如,创建一个名为 organizations
的 table 来存储具有 组织 级别的人员。架构可以是:
| person_id (FK to persons.id) | manager_id | other_fields |
然后另一个 table for authorities
存储 authority
级别的人。架构可以是:
| person_id (FK to persons.id) | decree_number | other_fields |
然后在Laravel中创建一个关系,我这里假设是one-to-one关系。
// Person.php
public function organizationProfile()
{
return $this->hasOne(Organization::class);
}
public function authorityProfile()
{
return $this->hasOne(Authority::class);
}
public function hasOrganization()
{
return $this->organizationProfile !== null;
}
public function hasAuthority()
{
return $this->authorityProfile !== null;
}
设计就像 Person
可以有配置文件(在您的情况下是 Organization 和 Authority)。可能还有其他设计,但这是我想到的。
总之,由于组织和权威都是人,只有另一个属性,我们刚刚创建了另一个 table 来保存这些属性,但不重复 Person 中已经存在的属性。我们将利用关系来确定 if 一个 Person 只是一个 Person,一个 组织或当局.
我有这种情况:
我有 Person
的 table(称为 persons
)。一个人有一个名字、一个 ID 和一个类型(自然的或法人的)。
然后我有Organization
,它当然是一个扩展了Person
的法人,并且有manager_id
或employees
这样的特定字段。
然后我有一个 Authority
这是一个特殊的政府 Organization
,所以最后也是一个 Person
并且还有像 decree_number
这样的特殊必填字段(数字和年份构成 Authority
) 的法令。
然后我有我的数据库,其中有一个名为 persons
的 table。
我的问题是:我应该为 organizations
创建一个新的 table,然后为 authorities
创建另一个吗?如果不是,我应该如何存储当局或组织所需的新字段而不是个人所需的新字段?
我在一个 Laravel 项目中这样做,我可以:
/* Person.php */
class Person extends Model {
}
/* Organization.php */
class Organization extends Person {
protected $table = 'persons';
}
/* Authority.php */
class Authority extends Organization {
protected $table = 'persons';
}
是的,创建另一个 table,但不要重复 persons
已有的数据,您可以为此使用关系。
例如,创建一个名为 organizations
的 table 来存储具有 组织 级别的人员。架构可以是:
| person_id (FK to persons.id) | manager_id | other_fields |
然后另一个 table for authorities
存储 authority
级别的人。架构可以是:
| person_id (FK to persons.id) | decree_number | other_fields |
然后在Laravel中创建一个关系,我这里假设是one-to-one关系。
// Person.php
public function organizationProfile()
{
return $this->hasOne(Organization::class);
}
public function authorityProfile()
{
return $this->hasOne(Authority::class);
}
public function hasOrganization()
{
return $this->organizationProfile !== null;
}
public function hasAuthority()
{
return $this->authorityProfile !== null;
}
设计就像 Person
可以有配置文件(在您的情况下是 Organization 和 Authority)。可能还有其他设计,但这是我想到的。
总之,由于组织和权威都是人,只有另一个属性,我们刚刚创建了另一个 table 来保存这些属性,但不重复 Person 中已经存在的属性。我们将利用关系来确定 if 一个 Person 只是一个 Person,一个 组织或当局.