我用一个例子来解释我的问题。
我的模型类是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']);
是一项艰巨的任务。
答案 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'];
}