2 回答
TA贡献1858条经验 获得超8个赞
Laravel 没有提供解决方案来为不同的表创建带有子类的基本模型。反过来也是完全可能的:
class Event extends Model
{
protected $table = 'events';
}
class EventA extends Event
{
protected static function boot()
{
parent::boot();
static::addGlobalScope(function (Builder $query) {
$query->where('events.type', '=', 'a');
});
}
}
class EventB extends Event
{
protected static function boot()
{
parent::boot();
static::addGlobalScope(function (Builder $query) {
$query->where('events.type', '=', 'b');
});
}
}
我通过使用数据透视表的中间模型并将某些属性代理到子模型来解决类似的问题。
那么你的关系将是BelongsTo和HasMany。
在 UX 方面,您可以通过有条件地检查资源属性来自定义 Nova 中的字段。尽管我建议仅在详细信息和表单视图上执行此操作,因为在返回具有不同列的行时索引表将关闭。
public function fields(Request $request)
{
return array_filter([
ID::make()->sortable(),
value(function () {
if ($this->type === 'a') {
return Boolean::make('A specific field')->hideFromIndex();
}
}),
value(function () {
if ($this->type === 'b') {
return Boolean::make('B specific field')->hideFromIndex();
}
}),
]);
}
TA贡献1812条经验 获得超5个赞
我最近才发现kirschbaum-development/nova-inline-relationship 这个包允许你将关系内联到一个 nova 资源中,因此允许一个像这样的结构:
class Event extends Model
{
public function eventable()
{
return $this->morphTo();
}
}
class Workshop extends Model
{
public function event()
{
return $this->morphOne(Event::class, 'eventable');
}
}
class StageTalk extends Model
{
public function event()
{
return $this->morphOne(Event::class, 'eventable');
}
}
然后在 nova 资源中
class Workshop extends Resource
{
public function fields(Request $request)
{
return [
MorphOne::make('Event')->inline(),
];
}
}
- 2 回答
- 0 关注
- 172 浏览
添加回答
举报