当前位置: 首页 > 知识库问答 >
问题:

Laravel如何仅在值发生更改时更新mysql中的值

柴霖
2023-03-14

我是新来的Laravel我想做的只是如下:

我的表单中有一些字段,如标题、描述。

标题字段在数据库中是唯一的。

这就是我所做的来更新我的价值观。

$product              = Product::find($id); 
$product->title       = $request->title;
$product->description = $request->description;
$product->save();

但这将导致错误(该值已经存在),因为我的标题字段是唯一的。

我只想在标题值更改时更新标题,否则更新相同的值,但更新其他字段。谢谢

共有3个答案

桑思远
2023-03-14

我没有看到您的任何数据库结构或表单代码,只看到上面您所说的小片段。

你可以做这样的事...

$checkTitle = Product::where('title', '=', $request->input('title')->first();

你也可以做。。。

   $record = Product::find($id)

    if($request->input('title') === $record->title){
     // Record with the $id has the same title as you are posting in the request.
    }else{
         // Title for $id lets say id number 3, Is not the same as the form request you are sending so now Perform insert
      }


   if(count($checkTitle) >= 1){
      // Means the title exists and do what ever you want...
     //  Perform update
    }else{
      // Perform insert
     }

抱歉又短又甜,要去办公室了,我想现在发帖可能会有帮助。让我知道,如果我在错误的轨道上,并在我可以的地方提供帮助。

宇文俊风
2023-03-14

您发布的代码完全(如果是间接的)符合您的要求。您的问题是另一个:您正在分配一个在其他地方使用的标题,从而违反了唯一性。

您必须验证新标题是否已被使用。

$duplicate = Product::where('title', '=', $request->title)->where('id', '!=', $id)->first();

在这一点上,还不清楚你想做什么:

a) 是否要使用重复记录而不是$id指示的记录?

b) 这是一个错误吗?

c) 是否应该更新$id记录,而不更新标题?

您可以做这些事情中的任何一件;您不能做的是“仅在TITLE值更改时更新我的TITLE”,因为更改后的值已经在其他地方使用了。

颜河
2023-03-14

像这样的东西?

$product = Product::find($id);

if ($product->title == $request->title) {
    $product->description = $request->description;
} else {
    $product->title = $request->title;
}

$product->save();
 类似资料:
  • 问题内容: 我在SQL Server中运行合并。在我的更新中,我只想更新值已更改的行。版本行在每次更新时都会递增。下面是一个示例: 现在,如果我只想更新行,从而增加版本,则仅在名称更改的情况下。 问题答案: 可以有。另外,无需更新。 如果Last_Name或First_Name可为空,则例如在比较trg.Last_Name <> src.Last_Name时,需要注意值。

  • 我正在创建一个网站。因此,有一个表可以显示用户。在我的数据库中,我为挂起列存储了0,为Approved under Action列存储了1。如果某个用户有0,则此表中将显示Pending,如果该用户有1,则将显示Approved。现在我想知道,当有人单击这个挂起按钮时,我想将数据库值更新为1。我试了一下,如下所示。但是,当我单击挂起按钮时,它会给我这个错误- 在我的网页浏览器地址栏里,我得到了正确

  • 问题内容: 仅在真正更改数据的情况下,才有可能使用“更新后”触发器。我知道“新旧”。但是使用它们时,我只能比较列。例如“ NEW.count <> OLD.count”。 但我想要类似的东西:如果“ NEW <> OLD”,则运行触发器 一个例子: 关键是,有一个更新,但是 什么都没有改变 。但是无论如何,触发器都在运行。恕我直言,应该有一个没有的方法。 我知道我可以使用 如果现在b <> OLD

  • 问题内容: 由于声誉的限制,这是对先前问题的回答的后续问题。 但是想象一下一个有变化的列的大桌子。您必须比较每列,如果数据库发生更改,则必须调整触发器。而且比较硬编码的每一行都没有“感觉”好:) 是的,但这就是进行的方式。 附带说明一下,在更新之前先检查一下也是一种好习惯: 在您的示例中,这将使其更新(从而覆盖)两行而不是三行。 我想知道在处理NULL值时是否有更有效的方法来测试每个字段的更改。

  • 问题内容: 在Dockerfile中,我有一个要安装的层: 当我构建Docker映像时, 无论 对该文件进行任何更改,它都会运行整个过程。 如何确保仅在文件发生更改的情况下运行Docker ? 问题答案: 我假设在构建过程中的某个时候,您正在使用或将整个应用程序复制到Docker映像中: 问题在于,每次将整个应用程序复制到映像时,您都会使Docker构建缓存无效。这还将使所有后续构建步骤的缓存无效

  • 问题内容: 我在表中有一条带有错误主键的记录。我想将其更改为正确的值,但该值在许多其他表中使用。 有没有简单的方法可以在同一时间更新主键和外键? 问题答案: 如果将外键设置为级联更改,则值应自动更改。