Laravel 中的多态、多对一关系

Polymorphic, many-to-one relationships in Laravel

我在思考如何构建它时遇到了一些麻烦,因为它似乎是所有 Laravel 文档和我发现的其他示例的“逆向”。我可能想多了。

我找到的所有示例都假设您有一种固定数据类型(例如 Comment),然后可以将其附加到任意数量的不同 'owners'。在我的例子中,我想要一个 'owner' 然后可以与任意数量的不同类型相关联。

考虑以下情况:

我们希望能够检索 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()