Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

Amid's avatar
Level 1

Edit Relation Trix Field with Files from Parent Resource Page

Hi I have two resources (Products and ProductDetails). Child Products must use their parent "ProductDetails" data or can create one "ProductDetails" for itself.

Products model:

class Product extends Model implements HasMedia
{
    public function details()
    {
        if ($this->hasParent())
        {
            return $this->parent->details();
        }
        return $this->hasOne(ProductDetails::class)->withDefault();
    }

    public function ownDetails()
    {
        return $this->hasOne(ProductDetails::class);
    }

    public function products()
    {
        return $this->hasMany(static::class, 'parent_id', 'id');
    }

    public function parent()
    {
        return $this->belongsTo(static::class, 'parent_id', 'id');
    }
}

ProductDetails model:

class ProductDetails extends Model
{
    protected $guarded = [];

    protected static function boot()
    {
        parent::boot();

        static::saving(function ($arr) {
            if (!isset($arr->product_id)) {
                return false;
            }
        });
    }

    public function product()
    {
        return $this->belongsTo(Product::class);
    }
}

Products table: id | parent_id | code:text | price:currency

ProductDetails table: id | product_id | title:text | guide:trix

Products Resource:

    public function fields(Request $request)
    {
        return [
            Trix::make(__('Guide'), 'details.guide')->withFiles('trix')->fillUsing(function ($request, $model) {
               // $model->details->ingredients = $request->details_ingredients;
               // $model->details->save();
            })
        ];
    }

protected static function fillFields(NovaRequest $request, $model, $fields)
    {
        if ($request->exists('details_title'))
        {
            $arr = [
                'details_title',
                'details_guide',
                // 'details_guideDraftId'
            ];
            // Get all of our details data
            $detailsFields = collect($request->only($arr))
                    ->flatMap(function ($item, $key) {
                    return [Str::replaceFirst('details_', '', $key) => $item];
                })->toArray();

            // Then remove them from the main request
            $request->except($arr);

            $result = parent::fillFields($request, $model, $fields);

            if ($detailsFields['title'])
            {
                $result[1][] = function () use ($detailsFields, $model, $request) {
                    // Update or delete depending of a null main value or null on all values.
                    $productID = $model->id;
                    if ($model->hasParent() && $request->get('parent'))
                    {
                        $productID = $model->parent->id;
                    }
                    if (!$request->get('parent'))
                    {
                        $model->parent_id = 0;
                        $model->save();
                    }
                    if ($model->id) {
                        $model->details()->updateOrCreate([
                            'product_id' => $productID
                        ], $detailsFields);
                    } else {
                        $model->details()->delete();
                    }
                };
            }
        }
        else
        {
            $result = parent::fillFields($request, $model, $fields);
        }

        return $result;
    }

ProductDetails Resource:

    public function fields(Request $request)
    {
        return [
            Trix::make(__('Guide'), 'guide')->withFiles('public'),
        ];
    }

Everything world find but trix attachments not saving. how can i store ProductDetails Trix Attachments in Product Update Page?

0 likes
0 replies

Please or to participate in this conversation.