如何在 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

如何使用 Laravel 的 Eloquent/Fluent 将每一行设置为相同的值?

Query Sql Server 能够删除表的最后一行

如何正确使用表值函数?

ORM SQLAlchemy 表于表的关系