Laravel Nova: динамически привязывать поля к атрибуту JSON в модели

Ларавель Нова

Для конкретного проекта я хотел бы использовать возможности пользовательского интерфейса 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 все еще ищет атрибуты на столе.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
2 940
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Спасибо! Это на самом деле делает именно то, что мне нужно, но похоже, что мне не хватало только способа определить имя поля через свойство данных, поэтому добавление data-> custom_field_name на самом деле все, что мне нужно. Resolveusing или DisplayUsing не нужны и, вероятно, более применимы, если я хочу изменить фактическое значение.

Heinz 02.03.2019 19:56

Пожалуйста! :) Да, Resolveusing или DisplayUsing не являются обязательными.

mrsingh-it 03.03.2019 11:07

Другие вопросы по теме