laravel красноречиво сериализует пользовательские отношения с несколькими таблицами

#php #laravel

Вопрос:

Я использую

 "laravel/framework": "^8.54",
 

и в моей структуре бд у меня есть модель, которая объединяет различные свойства по идентификатору и устанавливает столбец дискриминатора для идентификации с какой именно таблицей это реальность, вот так

sql

 create table configure_property_estates
(
    id                    bigint unsigned auto_increment
        primary key,
    estates_id            bigint unsigned not null,
    configure_property_id bigint unsigned not null,
    discriminator         varchar(100)    not null,
    created_at            timestamp       null,
    updated_at            timestamp       null,
    constraint configure_property_estates_estates_id_foreign
        foreign key (estates_id) references estates (id)
            on delete cascade
);

create index configure_property_estates_configure_property_id_index
    on configure_property_estates (configure_property_id);
 

ответ json

  "configure_property_estates": [
      {
        "id": 28,
        "estates_id": 14,
        "configure_property_id": 1,
        "discriminator": "ConfigureEstatePropertyKitchen",
        "created_at": "2021-10-10T15:17:46.000000Z",
        "updated_at": "2021-10-10T15:17:46.000000Z"
      },
      {
        "id": 29,
        "estates_id": 14,
        "configure_property_id": 1,
        "discriminator": "ConfigureEstatePropertyRequirements",
        "created_at": "2021-10-10T15:17:47.000000Z",
        "updated_at": "2021-10-10T15:17:47.000000Z"
      },
      {
        "id": 30,
        "estates_id": 14,
        "configure_property_id": 2,
        "discriminator": "ConfigureEstatePropertyType",
        "created_at": "2021-10-10T15:17:47.000000Z",
        "updated_at": "2021-10-10T15:17:47.000000Z"
      }
    ],
 

эта модель, без индекса FK только:

 class ConfigurePropertyEstates extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var string[]
     */
    protected $fillable = [
        'estates_id',
        'configure_property_id',
        'discriminator'
    ];

    public function getTable()
    {
        return 'configure_property_estates';
    }

    /**
     * Get all of the estates that are assigned this conf.
     */
    public function estates()
    {
        return $this->belongsTo(Estates::class, 'estates_id');
    }
}
 

os, my quesiton what need to do if I want extend json interpretation for this model by configure properties model, like this

   {
    "id": 28,
    "estates_id": 14,
    "configure_property_id": 1,
    "configure_property": {
        "id": 1,
        "some_property_column": "test"
    }
    "discriminator": "ConfigureEstatePropertyKitchen",
    "created_at": "2021-10-10T15:17:46.000000Z",
    "updated_at": "2021-10-10T15:17:46.000000Z"
  },
 

Существует ли какой-то способ для этого, какой-то тип отношений или может быть какой-то индивидуальный подход для повторного использования в этом случае ?

Обновить

Я добавил этот код в свою модель ConfigurePropertyEstates , и это работает так, как я ожидал

 public function toArray()
{
    $toArray = parent::toArray();
    $nameSpaceDiscriminator = EstatePropertiesService::fetchNameSpaceDiscriminator($toArray['discriminator']);
    if (!class_exists($nameSpaceDiscriminator)) {
        throw new Exception('class ' . $nameSpaceDiscriminator . ' does not exist');
    }
    $toArray['configure_property'] = $nameSpaceDiscriminator::whereId($toArray['configure_property_id'])->first();
    return $toArray;
}
 

ответ

   {
    "id": 28,
    "estates_id": 14,
    "configure_property_id": 1,
    "discriminator": "ConfigureEstatePropertyKitchen",
    "created_at": "2021-10-10T15:17:46.000000Z",
    "updated_at": "2021-10-10T15:17:46.000000Z",
    "configure_property": {
      "id": 1,
      "property_name": "test",
      "property_value": "tets",
      "available": 1,
      "created_at": null,
      "updated_at": null
    }
  },
 

Но похоже на какой-то пользовательский хак, есть какое-нибудь видение этого предложения ?

Комментарии:

1. вы имеете в виду полиморфные отношения ?

2. Я не уверен, я обновил свой вопрос, добавил раздел ОБНОВЛЕНИЯ