#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. Я не уверен, я обновил свой вопрос, добавил раздел ОБНОВЛЕНИЯ