使用Laravel Nova,我想在BelongsToMany子视图中显示一个计算字段。在中间模型中,我设置了一个虚拟属性字段,该属性使用连接的表来计算值。但是,该字段未得到显示,可能是因为Nova检查withPivot字段(由于它不是真实字段,因此无法添加到该字段)。是否有其他方法可以使它正常工作?
其背后的数据库模型是:
[GameVariation] has BelongsToMany using [GameVariationMatch] with [GameMatch]
[GameMatch] HasOne [Match]
在GameVariation资源中,我设置了一个BelongsToMany字段,该字段应显示计算出的字段:
BelongsToMany::make( 'Game Matches', 'game_matches', GameMatch::class )
->fields( function () {
return [
Text::make( 'Match Data' )->displayUsing(function() {
return $this->match_data;
})
];
} ),
在GameVariation模型中,表与BelongsToMany相关联:
final public function game_matches(): BelongsToMany {
return $this->belongsToMany(
GameMatch::class
)
->using( GameVariationMatch::class );
}
在数据透视表模型GameVariationMatch中,计算字段的设置如下:
final public function getMatchDataAttribute(): string {
return $this
->game_match
->match
->match_data;
}
答案 0 :(得分:0)
事实证明,在GameVariation资源上,从GameMatch资源提供BelongsToMany到GameMatch的索引视图。仅在GameVariation BelongsToMany字段上设置-> fields()时,它不会显示。推荐的方法是使用像这样的字段类来设置-> fields():
<?php
namespace App\Nova\Fields;
use App\Models\GameVariationMatch;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
class GameVariationMatchFields {
/**
* Get the pivot fields for the relationship.
*
* @param Request $request
*
* @return array
*/
final public function __invoke( Request $request ): array {
return [
Text::make( 'Match Data', function ( GameVariationMatch $GameVariationMatch ) {
return $GameVariationMatch->match_data;
} ),
];
}
}
在上面,计算的文本字段接收中间数据透视模型,因此可以访问所有计算的属性。
该字段类在GameVariation资源中用作:
BelongsToMany::make( 'Game Matches', 'game_matches', GameMatch::class )
->fields( new RoundMatchVariationFields ),
在GameMatch资源中为:
BelongsToMany::make( 'Game Variations', 'game_variations', GameVariation::class )
->fields( new GameVariationMatchFields ),
如Nova官方文档中有关枢纽字段https://nova.laravel.com/docs/2.0/resources/relationships.html#belongstomany
所述