Как сохранить значения зависимых списков в бд

Рейтинг: 3Ответов: 1Опубликовано: 19.05.2023

Пользователь выбирает завод и объект, счетчики объектов подтягиваются скрытно(один или несколько). Теперь хотелось бы понять как сохранять в бд значения что выбрал пользователь. Я думала вытащить из js factory_id и object_factory_id, в контроллере сделать условие, где по id брать наименования объектов и счетчиков и каким то магическим образом(на данный момент) записывать в бд. От нехватки знаний и опыта(изучаю) идей вообще нет. Кто нибудь с этим сталкивался может быть, подскажите?

Контроллер:

public function selectFactory()
    {
        $factories = Factory::all();
        return view('admin.user.show', ['factories' => $factories]);
    }

    public function selectFactoryObject(Request $request){
        if($request->ajax()){
            $objectFactories = ObjectFactory::where('factory_id',$request->factory_id)->get()->pluck("name","id"); //метод pluck задает ключ результирующей коллекции(как данные будут выводиться)
            $data = view('admin.user.show2',['objectFactories' => $objectFactories])->render();
            return response()->json(['options'=>$data]);
        }
    }

    public function selectTypeOfComplex(Request $request){
        if($request->ajax()){
            $typeOfComplexes = TypeOfComplex::where('object_factory_id',$request->object_factory_id)->get()->pluck("name","id"); //метод pluck задает ключ результирующей коллекции(как данные будут выводиться)
            $data = view('admin.user.show3',['typeOfComplexes' => $typeOfComplexes])->render(); 
            return response()->json(['option'=>$data]);
        }
    }

Основной шаблон:

<form action="{{ route('objectUser') }}" method="post">
        @csrf
        <div class="form-group">
            <label for="factories">Завод</label>
            <input type="hidden" name="factory"/>
            <select class="form-control" id="factories" name="factory">
                <option disabled selected value>Выберите завод</option>
                @foreach($factories as $factory)
                    <option  value="{{ $factory->id }}">{{ $factory->name }}</option>
                @endforeach
            </select>
        </div>

        <div class="form-group">
            <label for="objectFactories">Объект</label>
            <input type="hidden" name="object"/>
            <select class="form-control" id="objectFactories" name="object">  
                <option>Выберите объект</option>
            </select>
        </div>

        <div class="form-group">
            <!-- счетчики -->
            <label for="typeOfComplexes"></label>
            <input type="hidden" name="type_of_complex"/>
            <select style="display:none" multiple="multiple" class="form-control" id="typeOfComplexes" name="type_of_complex[]">
            </select>
        </div>

        <div class="mt-2 mb-5">           
            <input type="hidden" name="responsible" value="{{$user->name}}"/> 
            <button type="submit" class="btn btn-danger btn-sn" id="button">Сохранить</buttton>
        </div>
    </form>

    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

<script type="text/javascript">
    $(document).ready(function () {

    $("#factories").on('change', function(){
        var factory_id = $(this).val();
        var token = $("input[name='_token']").val(); 
        console.log(factory_id);
        
        $.ajax({
            url: "{{ route('selectFactoryObject') }}",
            method: 'POST',                              
            data: {factory_id:factory_id, _token:token},
            success: function(data) {
                $("#objectFactories").html('');
                $("#objectFactories").html(data.options);
            }
        });

    });

    $("#objectFactories").on('change', function(){
        var object_factory_id = $(this).val();
        var token = $("input[name='_token']").val(); 
        console.log(object_factory_id);

        $.ajax({
            url: "{{ route('selectTypeOfComplex') }}",
            method: 'POST',
            data: {object_factory_id:object_factory_id, _token:token},
            success: function(data) {
                $("#typeOfComplexes").html('');
                $("#typeOfComplexes").html(data.option);
                console.log(data.option);
            }
        });
    });
     });
</script>

Шаблон объектов:

<option>Выберите объект</option>
@if(!empty($objectFactories))
    @foreach($objectFactories as $key => $value)
        <option value="{{ $key }}">{{ $value }}</option>
    @endforeach
@endif

Шаблон счетчиков:

@if(!empty($typeOfComplexes))
    @foreach($typeOfComplexes as $key => $value)
        <option selected value="{{ $key }}">{{ $value }}</option>
    @endforeach
@endif

Роутеры:

Route::get('factoryform', 'App\Http\Controllers\Admin\VsepolzovateliController@selectFactory');
    Route::post('selectFactoryObject', 'App\Http\Controllers\Admin\VsepolzovateliController@selectFactoryObject')->name('selectFactoryObject');
    Route::post('selectTypeOfComplex', 'App\Http\Controllers\Admin\VsepolzovateliController@selectTypeOfComplex')->name('selectTypeOfComplex');


Route::post('/objectUser', [ObjectUserController::class, 'objectUser'])->name('objectUser');

Контроллер отправки данных в бд:

$objectUser=request()->validate([
            'responsible' =>'string',
            'factory' =>'string',
            'object' =>'string',
            'type_of_gas_metering_complex' =>'array',
        ]);

        $size = count($objectUser['type_of_gas_metering_complex']);

        $ggg = $objectUser['type_of_gas_metering_complex'];
        foreach($ggg as $item){

        for($i = 0; $i < $size; $i++){
            $objectUser=([
                'responsible' => $objectUser['responsible'],
                'factory' =>$objectUser['factory'],
                'object' =>$objectUser['object'],
                'type_of_gas_metering_complex' =>$item,
                
            ]);
            }
            ObjectUser::create($objectUser);
            return redirect()->route('objectUser')->with('success', 'Данные сохранены!');
        } 

Ответы

▲ 1Принят

Додумалась. Выше код корректен и работает. Было непонятно почему данные отправляются, доходят до контроллера, но в бд не записываются. В контроллере у меня принимаются id завода, объекта и счетчиков. Далее я нахожу по ним наименования(из соответствующих таблиц) и отправляю методом insert(); в бд!

Корректный контроллер отправки данных в бд:

public function objectUser(){   
        
        //валидация данных с формы
        $objectUser=request()->validate([
            'responsible' =>'string',
            'factory' =>'string',
            'object' =>'string',
            'type_of_complex' =>'array',
        ]);
        
        //id завода превращаем в его наименование
        $factoryyy=Factory::where('id', $objectUser['factory'])->get('name');
        foreach($factoryyy as $item)
        {
            $f = $item['name'];
        };
        //id объекта превращаем в его наименование
        $objecttt=ObjectFactory::where('id', $objectUser['object'])->get('name');
        foreach($objecttt as $item)
        {
            $o = $item['name'];
        };

        //кол-во счетчиков
        $size = count($objectUser['type_of_complex']);
        

        $ggg = $objectUser['type_of_complex'];
        foreach($ggg as $item){

            //id счетчика превращаем в его наименование
            $type_of_complexxx=TypeOfComplex::where('id', $item)->get('name');
            foreach($type_of_complexxx as $item)
            {
                $t = $item['name'];
            }; 

            for($i = 0; $i < $size; $i++){
            $objectUser=([
                'responsible' => $objectUser['responsible'],
                'factory' =>$f,
                'object' =>$o,
                'type_of_complex' =>$t,
            ]);
            }
            ObjectUser::insert($objectUser);
        } 
         return redirect()->back()->with('success', 'Данные сохранены!');       
    }

Решила оставить решение, вдруг еще кому поможет