【问题标题】:How to prevent duplicates in Laravel Eloquent?如何在 Laravel Eloquent 中防止重复?
【发布时间】:2021-11-13 08:23:51
【问题描述】:

我想在 NewsletterController.php 中转换我的数据库条目创建:

$email = $request->input('email');
$table = DB::table('newsletters');
$table->insert(array('email' => $email, 'created_at' => now()));

以防止重复条目。我试过这样做:

$table = DB::updateOrCreate('newsletters');

DB 似乎不存在此方法。我该怎么做?

【问题讨论】:

  • 你为什么使用DB而不是newsletters Elequent?或者您可以简单地将newsletter 表中的email 字段设置为unique,这将自动防止重复

标签: laravel eloquent


【解决方案1】:

当您可能想要更新数据库中的现有记录或在不存在匹配记录时创建它时。在这种情况下,可以使用updateOrInsert 方法。 updateOrInsert 方法接受两个参数:查找记录的条件数组,以及指示要更新的列的列和值对数组。

updateOrInsert 方法将尝试使用第一个参数的列和值对来定位匹配的数据库记录。如果记录存在,它将使用第二个参数中的值进行更新。如果找不到记录,将插入一条新记录,其中包含两个参数的合并属性

 DB::updateOrInsert(['email'=>$eamil],['created_at'=>Carbon::now()]);

现在,如果电子邮件存在,“created_at”将被更新,否则将插入一个新行,其中包含合并数组参数的值

【讨论】:

  • 这应该被接受
【解决方案2】:

updateOrCreate 用于 Eloquent Builder,updateOrInsert 用于 Query Builder。试试updateOrInsert

$table = DB::updateOrInsert->table('newsletters')->([ 'id' => $request->id ], [
  'email' => $email,
]);

【讨论】:

    【解决方案3】:

    感谢Moussab Kbeisy的评论,我可以验证uniqueness,如果不满足,它将返回422 error,而不是插入数据库:

    $this->validate($request, [
        'email' => 'required | unique:newsletters'
    ]);
    
    $email = $request->input('email');
    $table = DB::table('newsletters');
    $table->insert(['email' => $email, 'created_at' => now()]);
    

    【讨论】:

    • 您误解了您所指的评论。建议是create a unique index at the database level - 这是当您拥有一个应该是唯一的字段时的标准做法。他们提出的另一个建议是使用Eloquent models 而不是混淆DBinsert,然后你可以使用updateOrCreate(),并且会大大简化许多其他事情。
    • 我真的建议您尝试一些教程,甚至只是 reading the docs,我认为您缺少一些可能有助于您的开发之旅的非常关键的基本想法。
    • 是的,我是菜鸟。我会研究你的建议。谢谢
    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多