Laravel 雄辩:更新父记录并使用一种形式在另一个表中创建新记录

Posted

技术标签:

【中文标题】Laravel 雄辩:更新父记录并使用一种形式在另一个表中创建新记录【英文标题】:Laravel eloquent: updating a parent record and creating a new record in another table with one form 【发布时间】:2019-08-17 18:37:24 【问题描述】:

我有两个表,即machinescallsmachines 表有一个机器列表及其详细信息。目前,要记录有关机器的故障呼叫,管理员将输入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 列与machines 表中的id 列不同

【问题讨论】:

不确定注意是什么意思,如果您没有机器ID,您需要如何更新它? 我的意思是machine_id 在数据库中没有自动递增...id 包含在搜索结果数组中 不管它是否包含机器对象的外键,数据库中必须自动递增的是机器表中的id @Austin 如果machine_idmachine 表的外键,那么无论如何它都不会是calls 表中的自动增量。 您要更新机器表中的哪些列? 【参考方案1】:

在返回语句之前,您可以通过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();

【讨论】:

我在$machine-&gt;machine_custodian = $call-&gt;machine_custodian; 收到一个Creating default object from empty value 错误 您是在return 之前添加此代码吗?您能否在 `$call->save();` 行之后添加 dd($call) 并向我们展示输出? 是的,..dd($machine) 返回 null 但 dd($call) 返回要保存的数组...这意味着代码可以正常工作,直到 $call-&gt;save(); dd($call-&gt;machine_id) 输出? dd($call-&gt;machine_id) 给出machine_id

以上是关于Laravel 雄辩:更新父记录并使用一种形式在另一个表中创建新记录的主要内容,如果未能解决你的问题,请参考以下文章

雄辩的条件更新

无法使用 Laravel 雄辩模型更新 json 列

在 laravel 中具有雄辩关系的更新期间从空值创建默认对象

Laravel:自我 JOIN 的雄辩查询

Laravel 5 具有雄辩的关系回调函数返回错误记录

laravel 雄辩的查询构建器更新自定义时间戳字段而没有任何逻辑