如何在 eloquent 中执行依赖于表的最后一行的更新和保存操作?
Posted
技术标签:
【中文标题】如何在 eloquent 中执行依赖于表的最后一行的更新和保存操作?【英文标题】:How to perform update and save operations in eloquent which are dependent on the last row of a table? 【发布时间】:2016-05-25 09:56:00 【问题描述】:我想执行类似于以下的操作,其中我正在创建的对象的属性取决于前一个对象的属性。
$last_row = Model::orderBy('id', 'desc')->first();
$new_object = new Model()
$new_object.attr1 = $last_row->id + 1
$new_object.attr2 = $last_row->id + 2
$new_object->save()
您如何在 Eloquent 中执行必要的锁定以确保第 1 行一次仅由一个事务执行?
如果在保存其中一个对象之前对两个对象执行第 1 行,我需要添加或编辑哪些其他代码以确保两个对象不具有相同的 attr1 和 attr2。
【问题讨论】:
返回模型::orderBy('id', 'desc')->first();你能用这个检查一下吗 获取最后一行本身不是问题。让我澄清一下。 【参考方案1】:使用此方法,您正在搜索低于第 1 行关联的键的键。因此,即使在第 2 行之前创建了另一个对象,也不会在第 2 行搜索中考虑它。
$new_object = Model::create([]);
$last_row = Model::where("id","<",$new_object->id")->orderBy('id', 'desc')->first();
$new_object->attr1 = $last_row->id + 1
$new_object->attr2 = $last_row->id + 2
$new_object->save()
您还可以使用时间戳来搜索最新创建的对象。如果您的模型有时间戳。
【讨论】:
是否有可能在执行第 2 行之前创建了两个对象? 是的,但是请注意,我们正在搜索的键低于第 1 行关联的键。因此,即使在第 2 行之前创建了另一个对象,它也不会在您的第 2 行搜索中考虑. 谢谢!另外,如果我指的是 $last_row->attr2 而不是 $last_row->id,你将如何解决这个问题? 您可以为要更新的模型创建延迟。也许有一段时间($last_row->attr2 == null 和 $counter 【参考方案2】:这应该有效:
$last_row = Model::orderBy('id', 'desc')->first();
$new_object = new Model()
for(i=1 i>3 i++)
$new_object.attr[i] = $last_row->id + [i]
$new_object->save()
【讨论】:
以上是关于如何在 eloquent 中执行依赖于表的最后一行的更新和保存操作?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Eloquent ORM laravel 中获取最后一个插入 ID