【问题标题】:Laravel: Check if record exists Before InsertionLaravel:在插入之前检查记录是否存在
【发布时间】:2017-12-08 08:36:29
【问题描述】:

我有两个表:assignments 表(列assignment_idStaff Nameasset_iddepartmentdatestatus)和一个assets 表(列asset_idtag_nameserial_numbermodel_numbercolor)。 asset 表列与 assignments 表相关联。我想在 assignments 表中执行插入,但在插入之前,我想检查 assignments 表中是否已经存在 asset_id 以及是否为 status = 'Active' 那么插入应该抛出错误/不应该发生。

AssignmentsController

class AssignmentController extends Controller
{

public function assignment(){
    $assignments = Assignment::all();
    return view('assignment/index', ['assignments' => $assignments]);
}   

  public function add(Request $request){

    $this->validate($request, [
        'assignment_id' => '',
        'staff_name' => 'required',
        'asset_id' => 'required',
        'department' => 'required',
        'date' => 'required',
        'status' => 'required'
    ]);
    $assignments =  new Assignment;
    $assignments  ->assignment_id = $request->input('assignment_id');
    $assignments  ->staff_id  = $request->input('staff_id');
    $assignments  ->asset_id = $request->input('asset_id');
    $assignments  ->department_id = $request->input('department_id');
    $assignments  ->date  = $request->input('date');
    $assignments  ->status = $request->input('status');

$count = Assignment::where('status', '=' ,'Active' )->
    where('asset_id', '=' ,$assignments->asset_id)->
    count();
    if($count) {
        abort(405, 'Trying to assign an already assigned asset');
    }

    $assignments  ->save();
    return redirect('/assignment/index') ->with('info', 'New Assignment Saved Successfully!');
}

Assginment.php

class Assignment extends Model
{
    protected $primaryKey = 'assignment_id';    

    public function asset()
    {
        return $this->belongsTo('App\Asset', 'asset_id');
    }
}

AssignmentsController 中的以下变量和 if 语句总是抛出 if statement 中的错误,无论它是否为真并且插入不会发生但是当整个语句被清除时,插入发生。

$count = Assignment::where('status', '=' ,'Active' )->
        where('asset_id', '=' ,$assignments->asset_id)->
        count();
        if($count) {
            abort(405, 'Trying to assign an already assigned asset');
        } 

所以我想要一种方法来检查要插入的记录是否已经存在,条件是 asset_id 存在,然后检查它是否是 status ='Active' 然后抛出一个错误,但如果不是,则插入发生。如果您理解它,请帮助。提前致谢。

【问题讨论】:

  • 即使没有 'status', '=' ,'Active' 和 'asset_id', '=' ,$assignments->asset_id 也会出现错误??
  • 是的,即使您没有 'status', '=' ,'Active' 和 'asset_id', '=' ,$assignments-> 也会抛出 abort(405, 'Trying to assign an already assigned asset'); 错误资产ID

标签: php laravel-5 error-handling


【解决方案1】:

你可以这样做:

public function add(Request $request){
    $this->validate($request, [
        'assignment_id' => '',
        'staff_name' => 'required',
        'asset_id' => 'required',
        'department' => 'required',
        'date' => 'required',
        'status' => 'required'
    ]);
    $assignment = Assignment::firstOrNew([ 
           "status" => "Active", 
           "asset_id" => $assignments->asset_id
    ], $request->all()); 
    abort_if($assignment->exists(), 405, 'Trying to assign an already assigned asset'); 
    $assignment->save();
    return redirect('/assignment/index')
          ->with('info', 'New Assignment Saved Successfully!');
}

【讨论】:

  • $assignment = Assignment::firstOrNew(["status" => "Active", "asset_id" => $assignments->asset_id], $request-all()); abort_if($assignment->exists(), 405, 'Trying to assign an already assigned asset'); 在使用您提供的上述代码行编辑添加函数后,我得到一个 FatalErrorException: Call to undefined function App\Http\Controllers\all()。你能帮我纠正这个错误吗?
  • 我不明白你想说什么。如何修复错误?
  • 好的,我已经对其进行了测试,它可以工作,但它并没有按照我的预期工作。如果asset_id 与表中具有相同asset_id 的任何记录匹配,它就可以工作,但我希望它满足两个条件。我想要它做的是如果要插入的记录与表中具有相同asset_id的任何记录匹配并且它的状态为“活动”,如果要插入的记录匹配具有相同asset_id的任何记录,则不要插入其他记录但是它的状态=“禁用”或除“活动”之外的任何内容,然后插入。如果你没有得到我,请告诉我,如果你得到我,请帮助我,再次感谢
  • 不确定我是否理解问题所在。上面的代码将(或应该)找到第一个具有status = "Active"asset_id = $assignments->asset_idAssignment,如果找到它将失败。
  • 它可以工作,但一旦asset_id 存在于表中,它也不允许插入。我刚刚再次对其进行了测试以确认,现在我得到了 MassAssignmentException : 状态。请查看我的最新问题以澄清问题。
【解决方案2】:

解决方案

  $count = Assignment::where('asset_id', '=' ,$assignments->asset_id)->
        where('status', '=' ,'Active')->
        count();
        if($count == 1 && $assignments->status != 'Disable') {
            abort(405, 'Trying to assign an already assigned asset');
        }

我的代码中的错误:我正在计算所有分配,如果有任何活动状态,我得到一个错误....我需要准确检查我想要分配的分配是活动还是禁用然后分配应该发生或不属于它的状态(活动/禁用)。谢谢你们特别是apokryfos

【讨论】:

  • if ( Assignment::where('asset_id', '=' ,$assignments->asset_id)->where('status', '=' ,'Active')->exists() ) { abort(405, 'Trying to assign an already assigned asset'); }
猜你喜欢
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 2014-01-19
  • 2014-10-08
  • 2021-08-18
  • 1970-01-01
  • 2015-03-24
  • 2015-01-21
相关资源
最近更新 更多