как обновить запись из массива в laravel? - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть форма, подобная следующей:

Form

В этой форме есть динамическая таблица c, где через jquery я могу Добавить или удалить поля ввода Dynami c. В эту таблицу записывается информация об инструментах, которые используются для изготовления детали, тогда основная модель является деталью, и, в свою очередь, внутри таблицы участвуют эти два объекта инструмента (красный цвет) и вставка (синий цвет)

Часть моего блейд-файла (динамические c поля ввода)

 <div class="box box-primary">
            <div class="box-header with-border">
                <h3 class="box-title">Herramientas</h3>               
            </div>
            <div class="box-body">
                <table class="table table-striped table-bordered table-condensed table-hover" id="dynamicTable">              
                    <tr>
                        <th width="5%">Posición</th>
                        <th width="20%">Herramienta</th>                 
                        <th width="20%">Inserto</th>                 
                        <th width="20%">Calidad</th>                       
                        <th width="5%"><button type="button" name="add" id="add" class="btn btn-success"><i class="fa fa-plus-square"></i></button></th>
                    </tr>
                    @forelse ($piece->tools as $p)  
                        <tr> 
                            <td><input type="text" name="addmore[0][position]" value="{{ $p->position }} " placeholder="Posición"  class="form-control select2" /></td>                                                 
                            <td><input type="text" name="addmore[0][code_tool]" value="{{ $p->code_tool }}"  placeholder="Herramienta"class="form-control" /></td>                        
                            <td><input type="text" name="addmore[0][code_insert]" value="{{ $p->insert->code_insert }}" placeholder="Inserto" class="form-control" /></td>                       
                            <td><input type="text" name="addmore[0][quality]" value="{{ $p->insert->quality }}" placeholder="Calidad" class="form-control" /></td>                      
                        </tr> 
                    @empty
                        <td colspan="4"></td>
                        <td><button type="button" class="btn btn-danger remove-tr"><i class="fa fa-trash "></i></button></td>
                    @endforelse                                     
                </table> 
            </div>
        </div>

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

метод хранения

  $addmore = $request->addmore;
                $arrTool = [];

                foreach($addmore as $add)
                {
                    $insert = Insert::create([
                        'code_insert' => $add['code_insert'],
                        'quality'     => $add['quality']
                    ]);  

                    $tools = $insert->tools()->create([
                        'position'   => $add['position'],
                        'code_tool'  => $add['code_tool'],                   
                        'insert_id'  => $insert->id                            
                    ]);                     

                    $arrTool[] = $tools->id;                  
                } 

С этим я отлично храню свои данные из своей динамической таблицы c. Теперь у меня проблема в том, что мне нужно обновить эту информацию. Так как же мне восстановить итерацию информации в этих динамических c полях и обновить их?

Я пытаюсь это сделать безуспешно. Я запутался в этой части:

Метод обновления:

   $piece  = Piece::findOrFail($id); 

                // $this->authorize('create', new Piece);                               
                // dd($piece);

                $addmore = $request->addmore;
                $arrTool = [];


                foreach($addmore as $add)
                {
                    $insert = Tool::where('insert_id', $piece->$id)->update([
                        'code_insert' => $add['code_insert'],
                        'quality'     => $add['quality']
                    ]);  

                    $tools = $insert->tools()->updateOrCreate([
                        'position'   => $add['position'],
                        'code_tool'  => $add['code_tool'],                   
                        'insert_id'  => $insert->id                            
                    ]);                     

                    $arrTool[] = $tools->id;                  
                }    

Мне нужен кто-то, кто поможет мне с обновлением этих динамических c полей

ОБНОВЛЕНО 1

Ну, я понимаю, прежде чем я хочу Чтобы понять ситуацию: как часть это основная модель, существует связь между инструментом и инструментом, в основном потому, что часть может иметь от одного до нескольких инструментов, и один и тот же инструмент может состоять из одной или нескольких частей. Во-первых, вы должны сначала найти кусок вместе со связанными инструментами через эту строку:

  $piece  = Piece::whit('tools')->findOrFail($id); 

Теперь, чтобы перебрать эти динамические c поля, нужно понимать, что в этой динамической c таблице Существует связь между инструментом и вставкой hasMany. Моя проблема здесь, если в моем методе store с этим я создаю:

 foreach($addmore as $add)
                {
                    $insert = Insert::create([
                        'code_insert' => $add['code_insert'],
                        'quality'     => $add['quality']
                    ]);  

в моем методе обновления, это не позволяет мне делать что-то вроде этого:

 foreach($addmore as $add)
                {
                    $insert = Insert::update([
                        'code_insert' => $add['code_insert'],
                        'quality'     => $add['quality']
                    ]);  

Это то, что меня смутило, каким образом я применяю logi c, потому что здесь я уже перебираю динамические c поля

ОБНОВЛЕНО 2

Я продолжаю пытаться обновить инструменты, которые принадлежат определенной части. Выполнить 2 вида испытаний. В первом тесте я создаю кусок и связываю 2 новых инструмента , как вы можете видеть на изображении, он успешно создан.

create_piece

Во втором тесте я обновляю созданную деталь , затем я изменяю некоторые поля своей собственной детали, и в то же время я модифицирую соответствующие инструменты. Что случилось? Часть была обновлена, то есть ее собственные поля были обновлены правильно. В случае инструментов вместо обновления уже созданных, произошло обратное, новый инструмент был создан, как вы можете видеть на изображении.

update_piece

Мой метод обновления выглядит следующим образом:

                $piece  = Piece::with('tools')->findOrFail($id); 


                $addmore = $request->addmore;
                $arrTool = [];


                foreach($addmore as $add)
                {
                    $insert = Insert::where('id', $add)->updateOrCreate([
                        'code_insert' => $add['code_insert'],
                        'quality'     => $add['quality']
                    ]);  

                    $tools = $insert->tools()->updateOrCreate([
                        'position'   => $add['position'],
                        'code_tool'  => $add['code_tool'],                   
                        'insert_id'  => $insert->id                            
                    ]);                     

                    $arrTool[] = $tools->id;                  
                }    

Пожалуйста, укажите, что я должен изменить в своем методе так, чтобы обновлялись только те инструменты, которые уже были созданы, в моем случае новый инструмент создается.

модель:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Piece extends Model
{
    protected $fillable = [
        'program_id', 'gag_id', 'denomination', 'code', 'part_piece', 'time', 'observation'
    ];    

    public function program()
    {
         return $this->belongsTo(Program::class);
    }  

    public function gag()
    {
        return $this->belongsTo(Gag::class);
    } 

    public function tools() 
    {        
        return $this->belongsToMany(Tool::class)->withTimestamps();
    }   

}

модель инструмента:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tool extends Model
{
    protected $fillable = [
        'insert_id', 'position', 'code_tool', 'type', 'category', 'status', 'description', 'reason'
    ];   


    public function insert()
    {
        return $this->belongsTo(Insert::class);
    } 

    public function pieces()
    {
        return $this->belongsToMany(Piece::class)->withTimestamps();
    }
}

вставка модели:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Insert extends Model
{
    protected $fillable = [
        'code_insert', 'quality', 'type', 'category', 'status', 'description', 'reason'
    ];

    public function tools()
    {
        return $this->hasMany(Tool::class);
    }
}

1 Ответ

0 голосов
/ 22 февраля 2020

При обновлении удалите свои предыдущие данные и вставьте новые снова.

Только для данных этих разделов:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...