我填充了一种形式,每个文本字段生成的都是基于数据库结果.我只需使用id命名每个文本字段.现在填写表单时,我用控制器保存.但是在插入数据库之前,我循环Request :: input()来检查每个项目是否存在这样的条目.我只是想知道是否有有效的方法来检查循环中的每个项目以将其插入到db中.这是我的代码
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 – 插入前检查数据库参数的有效方法的更多相关文章

  1. 详解前端HTML5几种存储方式的总结

    本篇文章主要介绍了前端HTML5几种存储方式的总结 ,主要包括本地存储localstorage,本地存储sessionstorage,离线缓存(application cache),Web SQL,IndexedDB。有兴趣的可以了解一下。

  2. PhoneGap / iOS上的SQLite数据库 – 超过5mb可能

    我误解了什么吗?Phonegap中的sqlitedbs真的有5mb的限制吗?我正在使用Phonegap1.2和iOS5.解决方法您可以使用带有phonegap插件的原生sqliteDB,您将没有任何限制.在iOS5.1中,Websql被认为是可以随时删除的临时数据…

  3. ios – 领域:如何获取数据库的当前大小

    是否有RealmAPI方法使用RealmSwift作为数据存储来获取我的RealmSwift应用程序的当前数据库大小?

  4. ios – Realm – 无法使用现有主键值创建对象

    我有一个对象有许多狗的人.应用程序有单独的页面,它只显示狗和其他页面显示人的狗我的模型如下我有人存储在Realm中.人有详细页面,我们取,并显示他的狗.如果狗已经存在,我会更新该狗的最新信息并将其添加到人的狗列表中,否则创建新狗,保存并将其添加到人员列表中.这适用于coredata.在尝试用他的狗更新人时,领域会抛出异常无法使用现有主键值创建对象解决方法这里的问题是,即使你正在创建一个全新的Rea

  5. ios – UIWebView中的WebSQL / SQLite数据库的最大大小(phonegap)

    我知道一般来说,Web应用程序的本地存储空间有5MB的限制.本地网页浏览应用程式是否也有这个限制?

  6. ios – Firebase离线存储高级 – 手动同步和进度信息

    >我可以提供一个捆绑数据库–安装App后我可以已经离线查询了Firebase数据?然后我有另一个关于Firebase的主要问题:>JSON存储是伟大的–但是这样我们不关心一个独特的结构,我们必须注意这一点插入总是正确的数据集?我从来没有试图显示实际的进展,但是当您从firebase中检索数据时,始终会在成功检索数据时调用onDataChange方法.https://firebase.google.com/docs/database/android/retrieve-data#read_data_onceC

  7. ios – 如何处理多用户数据库

    我的应用程序就像很多应用程序–它有一个用户输入用户名和密码的登录屏幕,以及登录按钮我的应用程序还使用CoreData来保存大多数用户的业务对象,当然也是用户特定的.我也有一个登出按钮来启用切换用户.这不会发生很多,但仍然是必要的).现在如果不同的用户登录,我需要获取他的具体数据.但是我该如何做呢?

  8. ios – Swift从Firebase数据库中获取特定价值

    我正在尝试从Firebase数据库中获取特定值.我看了一些像谷歌这样的文件,但我做不到.这是数据库的JSON文件:SWIFT代码:我想获得用户的电子邮件价值,而不是每个人.我怎样才能做到这一点?解决方法在您的代码中,快照将包含子值的字典.要访问它们,请将snapshot.value转换为Dictionary,然后访问各个子项是一个快照

  9. ios – Realm Swift:在卸载应用程序后是否可以保留数据库?

    使用realmswift,即使从设备上卸载应用程序,是否可以在设备内存中保留和维护应用程序的领域数据库文件?非常感谢您的帮助.解决方法删除应用程序时,应用程序的所有文件都是剩余的.iOS应用程序是沙盒.这意味着每个应用程序在磁盘中都有自己的空间,并有自己的目录,这些目录充当应用程序及其数据的主页.从iPhone删除应用程序会删除此沙箱,删除与该应用程序关联的所有数据.

  10. ios – 在没有XML的情况下更新sqlite数据库

    我的应用程序需要来自sqlite数据库的数据.它将附带此数据库的一个版本,但我需要定期更新它(很可能每月一次).通常情况下,我一直在通过我设置的一堆网络服务将我的应用程序的其他部分的更新作为XML发送,但我现在正在处理的这个特定数据库非常大(大约20-30MB),而且我当我尝试以这种方式发送时出现超时错误.我尝试将数据库放在我的公司服务器上,然后将其下载到NSData对象中.然后我将该数据对象保存

随机推荐

  1. php – 用户身份验证不会在Laravel包中持久存在

    谢谢事实证明问题在于新的Web中间件,将我需要会话数据的所有路由移动到路由组中,一切正常.

  2. php – 找不到laravel类(适用于localhost但不适用于DO服务器)

    这是一个重复的问题–例如:Laravel4migrations–classnotfound但是,我已经尝试了所有解决方案并且无法解决这个问题.脚本我在我的本地机器上创建了一个Laravel4项目–添加了一些类,控制器,视图等–项目运行良好.然后我将这个新的repo复制到我的DO服务器上–用composer等安装依赖项.该项目看起来不错,除了一个页面发出错误:您可以查看此页面here.我试过了…

  3. php – Laravel SSH服务器未存储在配置文件中

    我有一个涉及服务器管理的项目,我需要执行一些SSH命令.在Laravel我有SSH实用程序(远程),但我必须将配置放在一个文件中.我需要从数据库中连接存储在模型中的凭据.任何想法我怎么能这样做?

  4. php – 如何通过Axios将文件发送到Laravel

    我需要通过Axios将文件从客户端发布到服务器.这是我的Vuejs代码:这是我用于处理已发送文件的Laravel代码:但它始终返回否它不是文件.任何帮助将非常感激.您必须创建一个FormData对象并附加图像文件.一个例子是here.如果有效,请告诉我.

  5. php – Laravel API TokenMismatchException

    我有一个带有帖子数据的API调用;让我们说这是登录过程.使用Chrome的Postman扩展程序,我通过POST发送用户名和密码以登录用户.但是我得到了这样的信息:在我的基本控制器中,我有:当我用beforeFilter删除行时,一切正常.但这不是一个解决方案.任何POST调用都会收到此错误消息.我知道我需要这个_token.但是当我从API调用时,我如何获得此令牌?我知道我可以在Laravel中创建一个令牌,但是当我通过API从外部打电话时我怎么能这样做呢?

  6. php – Laravel重定向到一个路由,但随后apache给出了404错误

    这是我的最终(和工作)vhost配置:

  7. php – Laravel Collection键修改

    我使用Collection类中的filter方法从集合中删除一些对象.但在那次操作之后,有时会出现带钥匙的物体,例剩下1,4,5.我希望在过滤操作后总是有0,1,2,3等顺序的元素.有没有任何优雅的方法来做到这一点,而无需将表重写为新表?您可以使用LaravelCollection的values()方法以序列化顺序生成集合的键,如下所示:希望这可以帮助!

  8. php – Laravel 5,如何测试是否在控制器中选中了Checkbox

    如果选中复选框,我试图获取:在我看来:在我的控制器中:在web.PHP中:但不起作用.我该怎么办?谢谢你的答复.编辑1:这是我的形式很差的建设我相信你真正的问题是你有两种不同的形式.您的复选框采用一种形式,您的提交按钮采用第二种形式.我相信它们都需要采用相同的形式.否则,永远不会返回您的复选框状态,无论其状态如何.在您的视图中,尝试替换您提供的表单标记:

  9. php – Laravel 5 – 根据需要验证数组,但允许传递一个空数组

    我正在使用验证器验证Laravel5.4中的请求,请参阅文档:https://laravel.com/docs/5.4/validation#validating-arrays基本上,这是Controller中的代码:我想要求字段“items”的存在,并且这个代码可以实现,但问题是当“items”字段是空数组时验证失败,即,这是一种不受欢迎的行为.我知道这是“必需”参数的记录行为,但我没有看到任何

  10. php – Laravel扩展Form类

    我正在尝试扩展L4.1中的Form类,但我似乎错过了一些东西.我的文件基于API命名为FormBuilder.PHP,保存在app/libraries/extended/FormBuilder.PHP中.这实际上是我第一次尝试在Laravel中扩展核心类.我似乎无法指出如何正确扩展像这个Form类的核心类.编辑:我将“app/libraries/extended”添加到我的composer.jso

返回
顶部