public function store(Request $request,$ID,$inID){ $startOfDay = Carbon::Now()->startOfDay(); $endOfDay = Carbon::Now()->endOfDay(); $instruments = InstrumentReading::whereBetween('created_at',[$startOfDay,$endOfDay]) ->where('iv_inID','=',$inID) ->get(); foreach ($request->input() as $k => $v) { $read = new InstrumentReading; $read->iv_inID = $inID; $read->iv_ipID = $k; $read->iv_usID = Auth::user()->ID; $read->iv_reading = $v; $read->save(); } if ($instruments->count() > 0) { //to filter the iv_ipID... foreach($instruments as $instrument) { $instrument->iv_status = "VOID"; $instrument->save(); } }}用效率方法来说,您可以做的是简单地检查/获取数据库中的所有可行行,如果行已经插入,则检查循环.也只获取iv_ipID列,因为我们不需要表中的所有列进行检查.选择我们需要的列会更快.您可以直接使用Fluent( Query Builder)来强调从数据库中提取数据,因为它可以大大提高简单查询的性能.
public function store(Request $request,$inID){ // Search only records with submitted iv_ipID,iv_inID and created today $alreadyInserted = DB::table('instrument_readings') ->whereBetween('created_at',[ Carbon::Now()->startOfDay(),Carbon::Now()->endOfDay() ]) // Get only records with submitted iv_ipID ->whereIn('iv_ipID',array_keys($request->input())) // Get records with given iv_inID only ->where('iv_inID',$inID) // For our check we need only one column,// no need to select all of them,it will be fast ->select('iv_ipID') // Get the records from DB ->Lists('iv_ipID'); foreach ($request->input() as $k => $v) { // Very simple check if iv_ipID is not in the array // it does not exists in the database if (!in_array($k,$alreadyInserted)) { $read = new InstrumentReading; $read->iv_inID = $inID; $read->iv_ipID = $k; $read->iv_usID = Auth::user()->ID; $read->iv_reading = $v; $read->save(); } else { //todo }}
这是迄今为止最有效的方法,因为您只需立即获取您感兴趣的记录,而不是从今天开始的所有记录.另外,您只能获取一列,我们需要检查一列.雄辩地表现出对性能的大量过热,所以在建议的代码中,我直接使用Fluent,这将提高这部分代码的执行速度〜20%.
你在原代码中的错误是每次循环执行数据库调用.当您需要像检查这样简单的任务时,不要将数据库调用,查询等放在循环中.这是一个过度的杀戮.而是在循环之前选择所有需要的数据,然后进行检查.
现在这是为了防止您只需要将新的记录保存到数据库.如果你想 *** 纵循环中的每个记录,我们假设你需要循环遍历每个被提交的条目,获取模型或创建它,如果它不存在,然后用这个模型做其他事情,那么最有效的方式是这样的:
public function store(Request $request,$inID){ foreach ($request->input() as $k => $v) { // Here you search for match with given attributes // If object in DB with this attributes exists // It will be returned,otherwise new one will be constructed // But yet not saved in DB $model = InstrumentReading::firstOrNew([ 'iv_inID' => $inID,'iv_ipID' => $k,'iv_usID' => Auth::user()->ID ]); // Check if it is existing DB row or a new instance if (!$model->exists()) { // If it is a new one set $v and save $model->iv_reading = $v; $model->save(); } // Do something with the model here ..... }
这样Laravel会检查数据库中是否存在已传递参数的模型,如果是,则返回给您.如果它不存在,它将创建它的新实例,所以你可以设置$v并保存到db.所以你很乐意用这个模型去做任何事,你可以确定它存在于数据库之后.
总结以上是内存溢出为你收集整理的php – Laravel – 插入前检查数据库参数的有效方法全部内容,希望文章能够帮你解决php – Laravel – 插入前检查数据库参数的有效方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)