如何在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运行
时更新变量之前,
$。它再次变得相同