将多态数据库行转换为 Laravel 中相应的 Eloquent 模型

问题描述 投票:0回答:1

我可能在这里使用了错误的术语,对此我提前表示歉意!

我有一个现有的数据库表,看起来像..

活动:

id 类型 标题 日期
1 派对 夏日派对 2023-08-01
2 假期 圣诞节 2023-12-25

我有一个名为

Event
的父 Eloquent 模型,然后是
Holiday
Party

每个子模型都会扩展

Event
并应用一个范围,例如

static::addGlobalScope('type', function (Builder $builder) {
    $builder->where('type', 'PARTY');
});

这样我们就可以执行

Holiday::all()
Party::all()
,我们将获得过滤结果作为预期的
Party
Holiday
模型/类的集合。

每个子模型都有其独特的功能,例如

$party->dance()

用户可以参加可通过调用

$user->events
检索的事件,这只是一个 HasMany:

public function events(): HasMany
{
    return $this->hasMany(Event::class);
}

但是,当我们调用

$user->events
时,因为 HasMany 返回事件模型,我们会丢失每个模型上的 OOP 内容。

有没有办法在模型根据类型返回时对其进行变形?因此,我们不是得到

Event
的集合,而是在集合中得到
Party
Holiday
模型?

谢谢

php laravel eloquent model polymorphism
1个回答
1
投票

您可以像下面这样修改您的关系

public function events(): HasMany
{
    return $this->hasMany(Event::class)->where('type', 'PARTY');
}
© www.soinside.com 2019 - 2024. All rights reserved.