Laravel eloquent: обновление родительской записи и создание новой записи в другой таблице с одной формой

#php #html #laravel #eloquent #laravel-blade

#php #HTML #laravel #eloquent #laravel-blade

Вопрос:

У меня есть две таблицы, а именно machines и calls . machines Таблица содержит список машин и их сведения. В настоящее время, чтобы зарегистрировать сообщение о сбое на компьютере, администратор вводит machine_number (чтобы убедиться, что компьютер зарегистрирован в компании). Этот номер используется для поиска по machines таблице в базе данных, и результат будет отображен в форме.

Моя проблема в том, что я хочу иметь ситуацию, при которой по мере отправки формы в machines таблице будут обновляться сведения о компьютере (в случае изменения сведений), в то время как в calls таблице создается новая строка (для регистрации вызова ошибки).

Вот функция поиска:

 Route::any('/search_results',function(){
    $query = Input::get ( 'query' );
    $machine= Machine::where('machine_id','LIKE','%'.$query.'%')->get();
    return view('/addNewCall')->with('machine', $machine)->withQuery($query);
});
  

Это моя форма:

 <form action="{{route('Call.store')}}" method="POST">
    @csrf
    @if(count($machine) > 0)
        @foreach($machine as $machine)
            <div class="col-md-6">
                <div class="input-group" style="width: 100%;">
                    <label for="machine_id">{{ __('Machine ID') }}</label><br>
                    <input type="text" name="machine_id" id="machine_id" class="form-control" style="padding: 20px;" value="{{$machine->machine_id}}">
                </div>
            </div>
            <div class="col-md-6" style="margin-top:20px">
                <div class="input-group col-md-12" style="width: 100%;">
                    <label for="machine_custodian">{{ __('Machine Custodian Name') }}</label><br>
                    <input type="text" name="machine_custodian" id="machine_custodian" class="form-control" style="padding: 20px;" value="{{$machine->machine_custodian}}" required>
                </div>
            </div>
            <div class="col-md-6" style="margin-top:20px">
                <div class="input-group" style="width: 100%;">
                    <label for="call_logged_on">{{ __('Call logged on') }}</label><br>
                    <input type="datetime-local" name="call_logged_on" id="call_logged_on" class="form-control" style="padding: 20px;" required>
                </div>
            </div>
            <div class="input-group col-xs-12 form-group" style="margin-top:20px">
                <label for="fault_description">{{ __('Fault Description') }}</label><br>
                <textarea name="fault_description" id="fault_description" class="form-control" rows="7" cols="50"  required></textarea>
            </div>
            <div class="col-md-6">
                <div class="input-group" style="width: 100%;">
                    <label for="assigned_FE">{{ __('Field engineer in charge') }}</label><br>
                    <input type="text" name="assigned_FE" id="assigned_FE" class="form-control" style="padding: 20px;" value="{{$machine->assigned_FE}}" required>
                </div>
            </div>
        @endforeach
        <button type="submit" class="btn-primary" style="padding: 10px; font-size: 16px; border: 0; margin-top:25px">{{ __('Log 
        Call') }}</button>
    @else
        <h2 style="margin:30px; font-style:italic; font-weight:lighter" class="text-center">Sorry, there is no ATM with the terminal id of "<b>{{ $query }}</b>" in our database</h2>
    @endif
</form>
  

вот мой CallsController:

 public function store(Request $request)
{
    $this->validate($request,[
        'machine_id' => 'required',
        'machine_custodian' => 'required',
        'call_logged_on' => 'required',
        'fault_description' => 'required',
        'assigned_FE' => 'required',
    ]);
        //store in the database
    $call = new Call;
    $call->machine_id = $request->input('machine_id');
    $call->machine_custodian = $request->input('machine_custodian');
    $call->call_logged_on = $request->input('call_logged_on');
    $call->fault_description = $request->input('fault_description');
    $call->assigned_FE = $request->input('assigned_FE');
    $call->save();

    return redirect('/pages/newCall')->with('success', 'call created check pending calls to view call');
}
  

В настоящее время код создает новую строку в calls таблице. Но я не знаю, как улучшить код для обновления информации о компьютере в machines таблице.

Примечание: machine_id столбец отличается от id столбца в machines таблице

Комментарии:

1. Не уверен, что вы подразумеваете под ПРИМЕЧАНИЕМ , если у вас нет идентификатора машины, как вам нужно его обновить?

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

3. Не имеет значения, содержит ли она внешний ключ объекта machine, то, что должно быть автоматически увеличено в базе данных, — это id таблица in machines.

4. @Austin Если machine_id это внешний ключ для machine таблицы, он все равно никогда не будет автоматически увеличиваться в calls таблице.

5. Какие столбцы в таблице machines вы хотите обновить?

Ответ №1:

Перед операцией return вы можете получить свой объект «Machine» с помощью id и обновить нужные столбцы с помощью update() метода :

 $machine = Machine::find($call->machine_id);
$machine->update(['machine_custodian'=>$call->machine_custodian, 'assigned_FE'=>$call->assigned_FE]);
  

Также может быть :

 $machine = Machine::find($call->machine_id);
$machine->machine_custodian = $call->machine_custodian;
$machine->assigned_FE = $call->assigned_FE;
$machine->save();
  

Комментарии:

1. Я получаю Creating default object from empty value ошибку на $machine->machine_custodian = $call->machine_custodian;

2. Вы добавляете этот код непосредственно перед return ? не могли бы вы, пожалуйста, добавить dd($call) сразу после строки `$call->save();` и показать нам результат?

3. да, .. dd($machine) возвращает null, но dd($call) возвращает массив, который нужно сохранить … это означает, что код работает нормально, пока $call->save();

4. dd($call->machine_id) вывод?

5. dd($call->machine_id) дает machine_id