Ларавель Нова
Для конкретного проекта я хотел бы использовать возможности пользовательского интерфейса 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 и определить следующие поля (* игнорируя статус) в 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.
Я знаю, что могу настроить мутатор на модели котировок.
public function setClientIdAttribute($value)
{
set_data($this->data,'client_id',$value);
}
Однако для этого все равно потребуется «нединамическая» модель Quoation. Я хочу иметь возможность динамически добавлять поля в представление без необходимости изменять модель котировок за пределами основ. Примером из реальной жизни может быть ситуация, когда разные продукты имеют разные поля ввода, которые необходимо собрать перед созданием предложения. Затем я мог бы легко динамически вводить определение поля в Nova Resource, сохраняя при этом простую модель базы данных.
Я также попробовал ответ, предложенный на простой вопрос: Динамический атрибут модели Laravel
Однако предложенное решение не работает, поскольку Nova все еще ищет атрибуты на столе.
Я хотел бы получить некоторую информацию о том, как справиться с этим требованием.






вы можете сделать что-то вроде этого:
// Model
protected $casts = [
'data' => 'array'
];
// Nova Resource
Text::make('Client Id', 'data->client_id')->resolveUsing(function ($value) {
return $value;
}),
Пожалуйста! :) Да, Resolveusing или DisplayUsing не являются обязательными.
Спасибо! Это на самом деле делает именно то, что мне нужно, но похоже, что мне не хватало только способа определить имя поля через свойство данных, поэтому добавление data-> custom_field_name на самом деле все, что мне нужно. Resolveusing или DisplayUsing не нужны и, вероятно, более применимы, если я хочу изменить фактическое значение.