使用查询构建器

时间:2016-02-22 08:55:06

标签: laravel-5 laravel-query-builder laravel-orm

我用一个例子来解释我的问题。

我的模型类是User,观察者类是UserObserver

我在updated UserObserver方法中添加了一些代码,这些代码将在每次使用User模型update函数时运行。例如,只要在updated记录中发生更新,就会调用UserObserver(下面)中的User方法。

class UserObserver{
   function updated($userModel)
   {
      //Send mail code
   }
}

UserObserver数据更新时User中的代码有效,如下所示:

User::find(2)->update(['name'=>'Update Name']);

但是,当UserObserver数据以下列方式更新时,User中的代码将无法运行:

User::where('id', 2)->update(['name'=>'Update Name']);

当我调试时,我可以理解User::find(2)返回User模型对象,User::where('id', 2)将返回Builder个对象。那么,无论是使用User模型对象还是Builder对象更新它,如何使用我们的观察者类方法?

问题是,我确实有一个现有的应用程序,其中一些模型正在更新,如User::where('id', 2)->update(['name'=>'Update Name']);。将update语句修改为User::find(2)->update(['name'=>'Update Name']);是一项艰巨的任务。

3 个答案:

答案 0 :(得分:0)

尝试如下:

User::where('id', 2)->first()->update(['name'=>'Update Name']);

此代码的一个问题是,如果您的数据库中没有id = 2的用户,那么您将获得null并且您将获得并且异常可能是调用更新未定义的实体。

所以你可以避免这种情况,如下所示:

$user = User::where('id', 2)->first(); if(!empty($user)) { $user->getModel()->update(['name'=>'Update Name']); }

答案 1 :(得分:0)

亲爱的观察者不依赖于模型对象或构建器对象。 它适用于两种陈述......

User::where('id', 2)

"User::where('id', 2)"

我昨天遇到了同样的问题,但是我安装了上周一revisionable软件包,当我浏览该软件包时,我的代码private boolean DTS_firstTime = true; private int num_of_DTS_tries = 0; private long interval_DTS = 5 * 60 * 1000; public void checkDTS(){ // log.info("===Check DTS==="); if((System.currentTimeMillis() - remoteLane.getLastDTSReceived() > interval_DTS)){ if(num_of_DTS_tries >= 5){ //if (ipc_reachable) { if (getStates().getLNK().isStatus()) { if (getStates().getDTS().isStatus() || DTS_firstTime) { log.info(getRemoteLane().getName() + ">>DTS Service Failed."); DTS_firstTime = false; getStates().getDTS().setStatus(false); getRemoteLane().setDTSMode(""); dataSyncStopPlayback = false; doDataSyncAlert(); doDataSyncDisplay(); } } remoteLane.setLastDTSReceived(System.currentTimeMillis()); num_of_DTS_tries = 0; } else { sendDTSCommand(Status.ISDTSUP, ""); } num_of_DTS_tries++; } else{ // log.debug("DTS Mode: " +getRemoteLane().getDTSMode()); if (getRemoteLane().getDTSMode().equalsIgnoreCase(Status.OK)){ //if (ipc_reachable) { if (getStates().getLNK().isStatus()) { // if (!getStates().getDTS().isStatus()) { // clrDataSyncDisplay(); // } getStates().getDTS().setStatus(true); dataSyncStopPlayback = true; dataSyncAlert = false; if (!alert && !discrepancyalert && !exitWarningAlert) { getLane().setRoadBackground(getLane().stateColor); } //clrDataSyncDisplay(); } } else if (getRemoteLane().getDTSMode().equalsIgnoreCase(Status.NG)){ //if (ipc_reachable) { if (getStates().getLNK().isStatus()) { if (getStates().getDTS().isStatus() || DTS_firstTime) { log.info(getRemoteLane().getName() + ">>DTS Service Failed.."); DTS_firstTime = false; getStates().getDTS().setStatus(false); dataSyncStopPlayback = false; doDataSyncAlert(); doDataSyncDisplay(); try{ PrintStream myconsole = new PrintStream (new File ("E://TMC//250216.y.txt")); System.setOut(myconsole); myconsole.print(); } catch (FileNotFoundException fx) { System.out.println(fx); } } } } // getStates().getDTS().setStatus(true); num_of_DTS_tries = 0; } this.repaint(); } 上的工作。

实际上我将我的代码放在更新()方法中,但是当我将相同的代码放在save()方法中时,它的工作对我来说......

答案 2 :(得分:0)

用户模型类应具有可填充变量。

Stream

尝试在where子句后添加 first()方法。

int[] firstArray = new int[]{10, 20, 30, 40};
int[] secondArray = new int[]{50, 60, 70, 80};
Object[] merged =
        Stream
              .concat(Arrays.stream(firstArray).boxed(), Arrays.stream(secondArray).boxed())
              .toArray();

System.out.println(Arrays.toString(merged)); // [10, 20, 30, 40, 50, 60, 70, 80]

或扭曲where子句以获取 User 模型对象。

class User extends Model
{
   protected $fillable = ['name'];
}