这可能是一个与这里已经问到的关于将数组插入数据库的问题不同的问题,但我的问题完全不同。
下面是代码:
public function something(Request $request)
{
$id = $request ->id;
$name = $request->name;
$money = $request ->money;
$data = array(
'name' => $name,
'money' => $money,
);
$z = User::where('id',$id)
->select('name','money')
->first();
$data2 = array(
'name' => $z->name,
'money' => $z->money,
);
$diff = array_diff($data,$data2);
$diff_name = array_keys($diff);
$diff_values = array_values($diff);
for ($i = 0; $i < count($diff_name); $i++) {
$z->$diff_name[$i] = $diff_values[$i];
$z->save();
}
return 'Success';
}
型号:
class User extends Model
{
protected $table = 'users';
protected $fillable = ['name','money'];
public $timestamps = false;
}
$data:
array(2) { ["name"]=> string(9) "Somewhere" ["money"]=> string(7) "5123.00"}
$data2:
array(2) { ["name"]=> string(8) "Anywhere" ["money"]=> string(7) "5000.00"}
因此,我使用name($diff_name) array_diff来确定用户输入的值是否等于数据库中的原始值,如果值有差异,则获取列,然后插入新的value($diff_value).我是这样做的,因为为了历史日志的目的,我需要$diff_name的值。但是,我得到了这个错误Array to string conversion
,谢谢提前。
发布于 2020-02-17 15:27:25
有几个内置的、雄辩的方法,您可以实现。
public function something(Request $request)
{
$z = User::where('id',$request->id)
->select('name','money')
->first(); // You could also use '->firstOrFail()' if you want to stop execution if a model was not retrieved.
$z->fill([
'name' => $request->name,
'money' => $request->money,
]);
$diff = array_keys($z->getDirty());
$z->save()'
return 'Success';
}
$model->firstOrFail()
可用于停止执行,以防止错误试图操作未从数据库检索的模型。
$model->fill()
这可以用于传递要更新的值数组。
$request->只(‘name’,'money)
与其将数组传递给$model->fill()
,您还可以使用此方法。
$model->getDirty()
在更改模型属性之后(在保存它之前),您可以使用它获得一个关联数组,该数组包含已更改的属性和相应值。
https://stackoverflow.com/questions/60267629
复制