Laravel Nova показать вычисляемое поле в подстоле BelongsToMany - PullRequest
0 голосов
/ 08 июня 2019

Используя 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 голосов
/ 09 июня 2019

Оказывается, на ресурсе GameVariation индексное представление BelongsToMany для GameMatch подается из ресурса GameMatch.При настройке только -> fields () в поле GameVariation BelongsToMany оно не будет отображаться.Рекомендуемый способ -> 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

...