Laravel Nova: динамически привязывать поля к атрибуту JSON на модели - PullRequest
0 голосов
/ 25 февраля 2019

Laravel Nova

Для конкретного проекта я хотел бы использовать возможности пользовательского интерфейса Nova Resource в сочетании с более гибкой моделью данных.В частности, я хочу иметь возможность добавлять поля в ресурс для атрибутов, хранящихся внутри поля базы данных JSON, а не в таблице.

Особенности:

Модель базы данных: предложения (включая миграцию)

public function up()
{
    Schema::create('quotations', function(Blueprint $table)
    {
        $table->bigInteger('id', true);
        $table->timestamps();
        $table->string('client_name', 100)->nullable();
        $table->string('client_surname', 100)->nullable();
        $table->string('status', 10)->nullable()->default('NEW');
        $table->text('data')->nullable();
    });
}

Ресурс Nova

Таким образом, я могу определить «нормальный» ресурс NOVA и определить следующие поля (* игнорируя состояние) в App \ Nova \ Quotation:

public function fields(Request $request)
{
    return [
        Text::make('Client Name')->sortable(),
        Text::make('Client Surname')->sortable(),


    ];
}

Теперь мое «желание» состоит в том, чтобы что-то сделать с этим, используя несуществующий «bindTo» метод, чтобы проиллюстрировать то, чего я хочу достичь

public function fields(Request $request)
{
    return [
        Text::make('Client Name')->sortable(),
        Text::make('Client Surname')->sortable(),

        //Fields bound into the JSON data property  
        Text::make('Client Id')->bindTo('data.client_id),
        Date::make('Client Date Of Birth')->bindTo('data.client_date_of_birth),

        //etc       


    ];
}

Таким образом, когда модель предложения сохраняется, атрибуты client_name и client_surname сохраняются в базе данных, как обычно.но client_id и client_date_of_birth должны быть сохранены в атрибуте данных JSON.

Я знаю, что могу установить Mutator для модели предложений

public function setClientIdAttribute($value)
{
      set_data($this->data,'client_id',$value);
}

Однако для этого все еще требуется "нединамический"Котировочная модель.Я хочу иметь возможность добавлять поля к представлению в двух словах, не меняя модель предложения вне базовых принципов.Реальным примером может служить случай, когда различные продукты имеют разные поля ввода, чтобы собрать их перед созданием предложения.Затем я мог бы легко ввести динамическое определение поля в Nova Resource, сохранив при этом простоту модели базы данных.

Я также попробовал ответ, предложенный на простой вопрос: Динамический атрибут модели Laravel

Однако - предложенное решение не работает, так как Nova все еще ищет атрибуты на столе.

Я хотел бы получить некоторую информацию о том, как справиться с этим требованием.

1 Ответ

0 голосов
/ 01 марта 2019

вы можете сделать что-то вроде этого:

// Model
protected $casts = [
    'data' => 'array'
];

// Nova Resource  
Text::make('Client Id', 'data->client_id')->resolveUsing(function ($value) {
   return $value;
}),
...