我问这个问题是为了找到最好的做法。
DB::table('owners')
->where('property_id',$id)
->update(array('person_id'=>$owner));
问题是表owners
中可能没有要更新的行。在那种情况下,我需要制作一个INSERT INTO
而不是UPDATE
。
我的问题是我每次必须运行2个查询,一个用于检查行是否已存在,还有一个用于update
或insert into
。每次运行2个查询是否正确?有没有更好的方法来实现这一目标?我需要为用户快速保持队列进程。
更新:表owners
是多对多关系的中间表。不幸的是我无法使用ON DUPLICATE KEY
。
答案 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]);