php - 拉拉维尔背包。 1-1(一对一)关系

标签 php laravel eloquent laravel-backpack

我有 2 个 Eloquent 模型:

/**
* Entities/Products.php
*/
use CrudTrait;

protected $fillable = [
    'name', 'macronutrients_id',
];

public function macronutrients()
{
    return $this->hasOne(Macronutrients::class);
}


/**
* Entities/Macronutrients.php
*/
use CrudTrait;

protected $fillable = [
    'proteins', 'fats', 'carbons', 'calories', 'product_id'
];

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

我不知道如何通过 Laravel Backpack CRUD 在产品的编辑页面上显示包含所有常量营养素的表格(或类似选项列表的内容)?

换句话说,我想做这样的东西:

页面http://example.com/admin/product/2/edit :

* [text] Name

* Macronutrients:
[number] proteins
[number] fats
[number] carbons
[number] calories

其中 [text]、[number] 是输入字段。

最佳答案

我用一些自定义逻辑解决了这个问题。结果是:

Screenshot of my /admin/product/1/edit

首先,我创建了自定义字段:

<!-- /resources/views/vendor/backpack/crud/fields/product_macronutrients.blade.php -->

<!-- product_macronutrients -->

@php($macronutrients = isset($entry) ? $entry->macronutrients : false)

<div @include('crud::inc.field_wrapper_attributes') >

    @include('crud::inc.field_translatable_icon')

    <div class="array-container form-group">

        <table class="table table-bordered table-striped m-b-0">
            <thead>
                <tr>
                    <th class="text-center">{{-- <i class="fa fa-trash"></i>--}} </th>
                    @foreach( $field['columns'] as $column )
                        <th style="font-weight: 300!important;">
                            // l10n strings (productscatalog::labels.proteins, productscatalog::labels.fats and so on)
                            @lang("productscatalog::labels.$column")
                        </th>
                    @endforeach
                </tr>
            </thead>
            <tbody ui-sortable="sortableOptions" class="table-striped">
                <tr class="array-row">
                    <td>
                            <p><b>@lang("productscatalog::labels.macrontr")</b></p>
                    </td>
                    @foreach( $field['columns'] as $column)
                        <td>
                            <input
                                class="form-control input-sm"
                                type="text"
                                name="{{ $column }}"
                                value="{{ old($column) ? old($column) : $macronutrients ? $macronutrients->$column : '' }}"
                                @include('crud::inc.field_attributes')
                            />
                        </td>
                    @endforeach
                </tr>
            </tbody>
        </table>

    </div>
</div>

ProductCrudController:

public function setup()
{
    // other stuff...

    $this->crud->addField([
        'label'         => 'Macronutrients',
        'type'          => 'product_macronutrients',
        'name'          => '',
        'columns'       => [
            'proteins',
            'fats',
            'carbons',
            'calories',
        ],
    ]);
}


public function store(StoreRequest $request)
{
    $redirect_location = parent::storeCrud($request);

    $this->storeOrUpdateMacronutrients($request, $this->crud->entry);

    return $redirect_location;
}

public function update(UpdateRequest $request)
{
    $redirect_location = parent::updateCrud($request);

    $this->storeOrUpdateMacronutrients($request, $this->crud->entry);

    return $redirect_location;
}

public function destroy($id)
{
    $this->destroyMacronutrients($id);

    $return = parent::destroy($id);

    return $return;
}

protected function storeOrUpdateMacronutrients(Request $request, Product $product)
{
    $macronutrients = Macronutrients::firstOrNew(['id' => $product->id]);

    $macronutrients->proteins   = $request->input('proteins');
    $macronutrients->fats       = $request->input('fats');
    $macronutrients->carbons    = $request->input('carbons');
    $macronutrients->calories   = $request->input('calories');

    $macronutrients->save();
}

protected function destroyMacronutrients($productId)
{
    $macronutrients = Macronutrients::findOrFail($productId);

    $macronutrients->delete();
}

希望有帮助。

关于php - 拉拉维尔背包。 1-1(一对一)关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52106282/

相关文章:

laravel 5.1 eloquent select 带有前缀连接表

php - Laravel Eloquent,只选择存在关系的行

php - mysql/php 的 UTF8 问题

php - 带有包含数组的列的 Laravel 批量插入

javascript - 多次提交表单

php - 类似于 Facebook 搜索的 Laravel 原始全文查询

laravel - 如何同步hasMany关系的子表数据?

php - 我将如何在 Laravel Eloquent 中编写这个 MySQL 查询?

php - 使用 PHP 在 Mongo DB 中的文档中添加数据

php - MySQL-根据另一个表的列数从一个表获取记录