Oct 15, 2020
0
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?
Please or to participate in this conversation.