如果存在则更新否则插入。 MySQL - PHP

时间:2015-05-22 10:32:33

标签: php mysql sql laravel

我问这个问题是为了找到最好的做法。

DB::table('owners')
   ->where('property_id',$id)
   ->update(array('person_id'=>$owner));

问题是表owners中可能没有要更新的行。在那种情况下,我需要制作一个INSERT INTO而不是UPDATE

我的问题是我每次必须运行2个查询,一个用于检查行是否已存在,还有一个用于updateinsert into。每次运行2个查询是否正确?有没有更好的方法来实现这一目标?我需要为用户快速保持队列进程。

更新:owners是多对多关系的中间表。不幸的是我无法使用ON DUPLICATE KEY

2 个答案:

答案 0 :(得分:3)

你可以尝试使用Laravel的firstOrCreate方法检查用户是否存在。之后检索用户对象并将其传递给更新函数,否则如果找不到用户firstOrCreate方法会照顾你,因为它将创建一个新用户,其中包含您将提供的数据,并将自动增加最后一个用户+ 1 id。

还可以选择使用firstOrNew,它将根据您传递的数组值检查实例是否存在,如果找不到匹配项,它将自动创建您正在处理的模型的新实例操纵。

以下是firstOrNew

的示例

示例控制器文件。

public function getFirstUserOrNew($email)
   {

      $user = User::firstOrNew(['email' => $email]);

      if($user)
      {
        $this->UpdateUser($user);
      }
      else
      {
       $this->CreateUser($user);
      }
   }

    public function UpdateUser(User $user)
    {
      //Do update stuff
    }

    public function CreateUser(User $user)
    {
      //Do create stuff
    }

P.S - 我来自希腊,如果你想用母语讨论任何东西给我一个PM:)

修改 感谢@Pyton贡献看来你也可以使用updateOrCreate方法,因为它被解释为here

答案 1 :(得分:0)

如果要更新或插入行您可以使用updateOrCreate

$owner = Owner::updateOrCreate(['property_id' => $id], ['person_id'=>$owner]);