Laravel Nova在BelongsToMany子表中显示计算字段

时间:2019-06-08 17:44:46

标签: laravel-nova

使用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;
}

1 个答案:

答案 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

所述