我有一个应用程序,我需要在其中存储可能具有多种类型的一对多关系。
这个用例是一个log
模型,它有多个events
。但是event
可以是多种类型,比如transition
、decision
或message
。我想我可能想在这里使用多态关系,但是我不知道如何在模型和数据库中设置它。
任何指针从任何人谁做了类似的将是可怕的!TIA!
当前模型布局:
Application
+ id
+ name
-----
Log
+ id
+ application_id
+ {others}
-----
Transition (similar format for other event types)
+ id
+ from
+ to
+ {others}
public function eventable() {
return $this->morphTo();
}
我所尝试的
Event
+ id
+ name
-----
Eventables
+ event_id
+ eventable_id
+ eventable_type
当我接着试
$log = Log::create([
'id' => Str::uuid(),
'application_id' =>1,
'service' => 'Service',
'source' => 'Source',
'timestamp' => Carbon::now()->setTimezone('Europe/London')->format('Y-m-d H:i:s.v'),
'appid' => 'appid',
'traceid' => 'traceid',
'requestid' => 'requestid',
'sessionid' => 'sessionid',
'locale' => 'locale',
'seqid' => 1,
'partition' => 1,
'offset' => 0,
'request' => 'request',
'response' => 'response',
'data' => 'data',
]);
$event = Transition::create([
'from' => 'from',
'from_name' => 'from_name',
'from_type' => 'from_type',
'to' => 'to',
'to_name' => 'to_name',
'to_type' => 'to_type',
]);
$event2 = Transition::create([
'from' => 'from',
'from_name' => 'from_name',
'from_type' => 'from_type',
'to' => 'to',
'to_name' => 'to_name',
'to_type' => 'to_type',
]);
$log->events()->saveMany([
$event, $event2
]);
我得到
Column not found: 1054 Unknown column 'eventable_id' in 'field list' (SQL: update `transitions` set `eventable_id` = 3cc1308e-7539-43ee-8296-15fe5e317c6a, `eventable_type` = App\Models\Log, `transitions`.`updated_at` = 2022-12-05 15:53:02 where `id` = 19)
1条答案
按热度按时间esyap4oy1#
如果你想使用一个关系函数,你不能在一个常量类型的模型和许多不同类型的模型之间建立多态关系,你需要一个具有一对一多态关系的中间模型。
为此,您需要3种类型的表。
您的Logs模型看起来如下所示:
Events类如下所示
Transition类将如下所示
要加载任何事件对象,首先要加载事件关系,然后查询每个Event对象上的事件关系。通过使用
$logsQuery->with('events.eventable')
进行早期加载,可以减少查询次数。如果您需要每个事件对象都与Logs模型有直接关系,我能想到的唯一解决方案就是拥有单独的转换、决策和消息关系。