如何在Laravel中比较两个对象并获得不同的列
我有两个相同记录的对象,它们是我从数据库中获取的。一个在更新之前,另一个在更新之后。我想知道在此更新查询期间更改的列值如何在Laravel中比较两个对象并获得不同的列,laravel,eloquent,laravel-8,Laravel,Eloquent,Laravel 8,我有两个相同记录的对象,它们是我从数据库中获取的。一个在更新之前,另一个在更新之后。我想知道在此更新查询期间更改的列值 $before_update = DeliveryRun::find($id); $before_update->name = $request->input('name'); $before_update->save(); $after_update = DeliveryRun::find($id); compare($before_update, $a
$before_update = DeliveryRun::find($id);
$before_update->name = $request->input('name');
$before_update->save();
$after_update = DeliveryRun::find($id);
compare($before_update, $after_update)
我将在您的
DeliveryRun
模型上定义一个方法,该方法可用于比较相同类型的对象
假设我们希望能够执行类似于$deliveryRun->compareTo($otherDeliveryRun)
的操作。这似乎是一个很好的流畅语法,在我看来读起来很好
我们要做的是获取DeliveryRun
的属性及其值,我们正在调用compareTo
打开,然后将它们与DeliveryRun
的属性和值进行比较,我们将其作为compareTo
方法的参数提供
class DeliveryRun扩展了模型
{
公共功能比较(DeliveryRun$其他)
{
$attributes=collect($this->getAttributes())
->映射(函数($attribute,$key)使用($other){
如果($attribute!=$other->$key){
返回$key=$attribute;
}
})->拒绝(函数($attribute,$key){
return!$attribute | |在_数组中($key,['id','created_at','updated_at']);
});
返回$attributes;
}
}
上面获取当前($this
)DeliveryRun
的属性,将从getAttributes()
返回的数组转换为集合,以便我们可以使用映射()
函数,然后在DeliveryRun
模型上的每个属性上循环,将每个属性的键
和值
与提供的$other
DeliveryRun
模型进行比较
reject()
调用用于删除相同的属性
,以及一些属性
键,您可能不想只保留已更改的属性
更新
我在更新前将对象保存在其他变量中$before\u update=$delivery\u run代码>但更新后$before\u update
变量I也会更新
如果我理解正确的话,你仍然在比较同一个物体本身。试试下面的方法
$before=clone$delivery\u run;//使用克隆强制复制
$delivery_run->name='something';
$delivery_run->save();
$difference=$before->compareTo($delivery\u run);
我会考虑使用,如果你所做的一切都是在对象被保存/更新之后直接寻找对象的变化。
使用<代码> -GETchange()/<代码>如何?我试着像'dd($delivery_-run->compareTo($delivery_-run))一样使用它但是得到nothing@BilalArshad如果您完全按照dd($delivery\u run->compareTo($delivery\u run))
的方式使用它,那么您就是在将同一对象与自身进行比较。您想比较$before
和$after
之间的差异。您是对的,但我在更新之前将对象保存在其他变量中`$before\u update=$delivery\u run;`但是在更新后$before\u update
变量我也会得到updated@BilalArshad我已经在我的回答中添加了一个更新,希望澄清。是的。我尝试了它,但在保存$delivery\u运行时更新变量之前,$。它再次变得相同