rbn*_*per 2 laravel backpack-for-laravel
我正在为 Laravel 使用背包,并且我正在尝试在多对多关系中使用的数据透视表中添加/更新一些额外的列。
总结上下文:我有一个模型Task,另一个模型Machine和这个中间数据透视表machine_task包含 Task 和 Machine 之间的多对多关系
在此 machine_task 中,有machine_id、task_id和布尔列m(用于“每月”)、q(用于“季度”)、b(用于“一年两次”)和y(用于“每年”)。
这就是我所拥有的
在我的Models/Task.php 中,我定义了 m-2-m 关系
public function machines()
{
return $this->belongsToMany('App\Machine')->withPivot('m','q','b','y');
}
Run Code Online (Sandbox Code Playgroud)
在/app/Http/Controllers/Admin/TaskCrudController.php我有字段,最相关的是这个
$this->crud->addField([ // n-n relationship
'label' => "Machines", // Table column heading
'type' => "select2_from_ajax_multiple_custom", // a customized field type modifying the standard select2_from_ajax_multiple type
'name' => 'machines', // the column that contains the ID of that connected entity
'entity' => 'machines', // the method that defines the relationship in your Model
'attribute' => "name", // foreign key attribute that is shown to user
'model' => "App\Models\Machine", // foreign key model
'data_source' => url("api/machines"), // url to controller search function (with /{id} should return model)
'placeholder' => "Select machine(s)",
'minimum_input_length' => 0,
'pivot' => true,
'dependencies' => ['building_id'], // this "Machines" field depends on another previous field value
]);
Run Code Online (Sandbox Code Playgroud)
这完美的作品:当我创建或更新任务时,AJAX调用时返回正确的结果,值正确添加到选择2输入和数据透视表machine_task 填写正确,并更新TASK_ID和machine_id当我点击保存并返回按钮。
但是如何将额外的值m、q、b、y与task_id和machine_id一起插入数据透视表?
在TaskCrudController.php 的末尾我有
public function store(StoreRequest $request)
{
// your additional operations before save here
// What I should do here to get the pivot values into the request??????????????
$redirect_location = parent::storeCrud($request);
// your additional operations after save here
// use $this->data['entry'] or $this->crud->entry
return $redirect_location;
}
public function update(UpdateRequest $request)
{
// your additional operations before save here
// What I should do here to get the pivot values into the request??????????????
$redirect_location = parent::updateCrud($request);
// your additional operations after save here
// use $this->data['entry'] or $this->crud->entry
return $redirect_location;
}
Run Code Online (Sandbox Code Playgroud)
在我修改后的select2_from_ajax_multiple版本中,我为每个选择的选项添加了一些带有复选框的行。让我们在屏幕截图中看到以便更好地理解
select2_from_ajax_multiple_custom
在/vendor/backpack/crud/src/resources/views/fields/select2_from_ajax_multiple_custom.blade.php我这样初始化值,然后我使用jquery更新与select2控件同步的行,但我不知道如何将 m,q,b,y 复选框与每个 select2 选定选项相关联,并将它们传递给请求。
@if ($old_value)
@foreach ($old_value as $item)
@if (!is_object($item))
@php
$item = $connected_entity->find($item);
@endphp
@endif
<div id="div{{ $item->getKey() }}">
<span> {{ $item->getKey() }} {{ $item->{$field['attribute']} }} -- </span>
Monthly <input type="checkbox" id="m{{ $item->getKey() }}" name="m{{ $item->getKey() }}" value="1" @php if ($item->pivot['m'] == "1") echo "checked"; @endphp >
Quarterly <input type="checkbox" id="q{{ $item->getKey() }}" name="q{{ $item->getKey() }}" value="1" @php if ($item->pivot['q'] == "1") echo "checked"; @endphp>
Biannual <input type="checkbox" id="b{{ $item->getKey() }}" name="b{{ $item->getKey() }}" value="1" @php if ($item->pivot['b'] == "1") echo "checked"; @endphp>
Yearly <input type="checkbox" id="y{{ $item->getKey() }}" name="y{{ $item->getKey() }}"value="1" @php if ($item->pivot['y'] == "1") echo "checked"; @endphp> <br/>
@php
@endphp
</div>
@endforeach
@endif
Run Code Online (Sandbox Code Playgroud)
非常感谢您抽出宝贵的时间,希望您能帮助我!有点坚持这个!
我已经能够解决它,所以我会发布解决方案,因为它可能对其他人有用。
我做了什么,
在我的TaskCrudController.php 中,我添加了底层的 Task 模型
// add this to the use statements
use App\Models\Task;
Run Code Online (Sandbox Code Playgroud)
然后,也在TaskCrudController.php 中我做了这个
// Notice: You need to add this to "create" function as well, I'm just writing here the update function to keep it short.
public function update(UpdateRequest $request)
{
$redirect_location = parent::updateCrud($request);
foreach ($request->machines as $machine) {
$set= array('m'=>'0','t'=> '0', 's' => '0', 'a' => '0');
if (isset($request['m'])) in_array ($machine, $request['m']) ? $set['m'] = '1' : $set['m'] = '0';
if (isset($request['t'])) in_array ($machine, $request['t']) ? $set['q'] = '1' : $set['q'] = '0';
if (isset($request['s'])) in_array ($machine, $request['s']) ? $set['b'] = '1' : $set['b'] = '0';
if (isset($request['a'])) in_array ($machine, $request['a']) ? $set['y'] = '1' : $set['y'] = '0';
Task::find($request->id)->machines()->syncWithoutDetaching([$machine => $set]);
return $redirect_location;
}
// Code explanation:
// what we are doing basically here is to grab the $request data
// For example: In the $request we receive m[3] b[1,3] y[1] arrays
// meaning that for our task:
// Machine 1 has no monthly, no quarterly but biannual and yearly checkboxes checked
// Machine 3 has monthly, no quarterly, biannual and no yearly checkboxes checked
// with the loop above, we cast that incoming data into this structure
// $set would contain after the loop:
// '1' => ['m' => '0', 'q'=> '0', 'b' => '1', 'y' => '1']
// '3' => ['m' => '1', 'q'=> '0', 'b' => '1', 'y' => '0']
// with that, we updated the intermediate table using syncWithoutDetaching
Run Code Online (Sandbox Code Playgroud)
现在让我们看看select2_from_ajax_multiple_custom.blade.php虽然我没有发布所有代码(其余的与 select2_from_ajax_multiple 标准字段相同)
<div @include('crud::inc.field_wrapper_attributes') >
<label>{!! $field['label'] !!}</label>
@include('crud::inc.field_translatable_icon')
<select
name="{{ $field['name'] }}[]"
style="width: 100%"
id="select2_ajax_multiple_custom_{{ $field['name'] }}"
@include('crud::inc.field_attributes', ['default_class' => 'form-control'])
multiple>
@if ($old_value)
@foreach ($old_value as $item)
@if (!is_object($item))
@php
$item = $connected_entity->find($item);
@endphp
@endif
<option value="{{ $item->getKey() }}" selected>
{{ $item->{$field['attribute']} }}
</option>
@endforeach
@endif
</select>
// What I added is:
<div id="freq">
@if ($old_value)
@foreach ($old_value as $item)
@if (!is_object($item))
@php
$item = $connected_entity->find($item);
@endphp
@endif
<div id="div{{ $item->getKey() }}">
<span>{{ $item->{$field['attribute']} }} -- </span>
Monthly <input type="checkbox" id="m{{ $item->getKey() }}" name="m[]" value="{{ $item->getKey() }}" @php if ($item->pivot['m'] == "1") echo "checked"; @endphp >
Quarterly <input type="checkbox" id="q{{ $item->getKey() }}" name="q[]" value="{{ $item->getKey() }}" @php if ($item->pivot['q'] == "1") echo "checked"; @endphp>
Biannual <input type="checkbox" id="b{{ $item->getKey() }}" name="b[]" value="{{ $item->getKey() }}" @php if ($item->pivot['b'] == "1") echo "checked"; @endphp>
Yearly <input type="checkbox" id="y{{ $item->getKey() }}" name="y[]"value="{{ $item->getKey() }}" @php if ($item->pivot['y'] == "1") echo "checked"; @endphp> <br/>
</div>
@endforeach
@endif
</div>
// js code to add or remove rows containing the checkboxes (This needs to be put inside <script> tags obviously) $("#select2_ajax_multiple_custom_machines").on("select2:select", function(e) {
// add checkbox row
htmlRow = "<div id=\"div"+e.params.data.id+"\">"+"<span> "+e.params.data.text+"-- </span>"+" Monthly <input type=\"checkbox\" id=\"m"+e.params.data.id+"\" name=\"m[]\" value=\""+e.params.data.id+"\">";
htmlRow += " Quarterly <input type=\"checkbox\" id=\"q"+e.params.data.id+"\" name=\"q[]\" value=\""+e.params.data.id+"\">";
htmlRow += " Biannual <input type=\"checkbox\" id=\"b"+e.params.data.id+"\" name=\"b[]\" value=\""+e.params.data.id+"\">";
htmlRow += " Yearly <input type=\"checkbox\" id=\"y"+e.params.data.id+"\" name=\"y[]\" value=\""+e.params.data.id+"\"><br/>";
htmlRow += "</div>";
$("#freq").append(htmlRow);
});
$("#select2_ajax_multiple_custom_machines").on("select2:unselect", function(e) {
// remove checkbox row
$("#div"+e.params.data.id).remove();
});
Run Code Online (Sandbox Code Playgroud)
这就是全部,伙计们。希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
2030 次 |
| 最近记录: |