Laravel 中的多态、多对一关系
Polymorphic, many-to-one relationships in Laravel
我在思考如何构建它时遇到了一些麻烦,因为它似乎是所有 Laravel 文档和我发现的其他示例的“逆向”。我可能想多了。
我找到的所有示例都假设您有一种固定数据类型(例如 Comment
),然后可以将其附加到任意数量的不同 'owners'。在我的例子中,我想要一个 'owner' 然后可以与任意数量的不同类型相关联。
考虑以下情况:
- 我们从
Entity
开始
- 一个
Entity
可以有任意数量的Components
Components
可以是两种或三种不同的可能类型之一,每种类型都拥有自己的数据(在自己的数据库中 table),但具有通用的访问接口
- 给定的
Entity
可能有 0 个分量、1 个分量或 24 个分量
我们希望能够检索 Entity
、枚举其 Component
并访问它们。
我想我有正确的数据库模式,但不知道如何制作 classes。
Schema::create('entities', function (Blueprint $table) {
$table->id();
/* ... other boring stuff */
$table->timestamps();
});
Schema::create('components_entities', function (Blueprint $table) {
$table->id();
$table->foreignIdFor(Entity::class);
$table->string('component_type');
$table->foreignId('component_id');
$table->timestamps();
});
/* Example of type of component - class App\Models\Components\HaaProperties */
Schema::create('ecd_propbag', function (Blueprint $table) {
$table->id();
$table->json('bag');
$table->timestamps();
});
/* Example of type of component - class App\Models\Components\IsRecoverable */
Schema::create('ecd_recoverable', function (Blueprint $table) {
$table->id();
$table->integer('recovery_time');
$table->integer('recovery_cost');
$table->timestamps();
});
鉴于此结构,如何在 class 级别建立关系?
据我了解,一个实体可以有很多组件,而组件有多种类型
//Component Model
public function type()
{
return $this->hasOne('App\Models\Components\Type');
}
public function entity()
{
return $this->belongsTo('App\Models\Components\Entity');
}
//Entity Model
public function components()
{
return $this->hasMany('App\Models\Components');
}
检索实体的组件
Entity::all()->first()->components()
我在思考如何构建它时遇到了一些麻烦,因为它似乎是所有 Laravel 文档和我发现的其他示例的“逆向”。我可能想多了。
我找到的所有示例都假设您有一种固定数据类型(例如 Comment
),然后可以将其附加到任意数量的不同 'owners'。在我的例子中,我想要一个 'owner' 然后可以与任意数量的不同类型相关联。
考虑以下情况:
- 我们从
Entity
开始
- 一个
Entity
可以有任意数量的Components
Components
可以是两种或三种不同的可能类型之一,每种类型都拥有自己的数据(在自己的数据库中 table),但具有通用的访问接口- 给定的
Entity
可能有 0 个分量、1 个分量或 24 个分量
我们希望能够检索 Entity
、枚举其 Component
并访问它们。
我想我有正确的数据库模式,但不知道如何制作 classes。
Schema::create('entities', function (Blueprint $table) {
$table->id();
/* ... other boring stuff */
$table->timestamps();
});
Schema::create('components_entities', function (Blueprint $table) {
$table->id();
$table->foreignIdFor(Entity::class);
$table->string('component_type');
$table->foreignId('component_id');
$table->timestamps();
});
/* Example of type of component - class App\Models\Components\HaaProperties */
Schema::create('ecd_propbag', function (Blueprint $table) {
$table->id();
$table->json('bag');
$table->timestamps();
});
/* Example of type of component - class App\Models\Components\IsRecoverable */
Schema::create('ecd_recoverable', function (Blueprint $table) {
$table->id();
$table->integer('recovery_time');
$table->integer('recovery_cost');
$table->timestamps();
});
鉴于此结构,如何在 class 级别建立关系?
据我了解,一个实体可以有很多组件,而组件有多种类型
//Component Model
public function type()
{
return $this->hasOne('App\Models\Components\Type');
}
public function entity()
{
return $this->belongsTo('App\Models\Components\Entity');
}
//Entity Model
public function components()
{
return $this->hasMany('App\Models\Components');
}
检索实体的组件
Entity::all()->first()->components()