如果存在,请更新或插入。MySQL-PHP

如果存在,请更新或插入。MySQL-PHP,php,mysql,sql,laravel,Php,Mysql,Sql,Laravel,我问这个问题是为了找到最佳实践 DB::table('owners') ->where('property_id',$id) ->update(array('person_id'=>$owner)); 问题是表中的所有者可能没有要更新的行。在这种情况下,我需要将插入到中,而不是更新 我的问题是每次必须运行两个查询,一个用于检查行是否已存在,另一个用于更新或插入到中。每次运行2个查询是否正确?有没有更好的方法来实现这一点?我需要为用户保持快速的奇怪进程 更新:表所有

我问这个问题是为了找到最佳实践

DB::table('owners')
   ->where('property_id',$id)
   ->update(array('person_id'=>$owner));
问题是表
中的所有者可能没有要更新的行。在这种情况下,我需要将
插入到
中,而不是
更新

我的问题是每次必须运行两个查询,一个用于检查行是否已存在,另一个用于
更新
插入到
中。每次运行2个查询是否正确?有没有更好的方法来实现这一点?我需要为用户保持快速的奇怪进程


更新:
所有者
是多对多关系的中间表。不幸的是,我不能在重复键上使用

您可以尝试使用
first或创建
方法来检查用户是否存在。之后,检索用户对象并将其传递给更新函数,否则如果找不到该用户,则
first或create
方法将处理您的问题,因为它将使用您提供的数据创建一个新用户,并将自动递增最后一个用户+1 id

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

下面是
firstOrNew

示例控制器文件。 另外,我来自希腊,如果你想用母语讨论任何事情,请给我一个下午:)

编辑:
由于@Pyton的贡献,您似乎还可以使用
updateOrCreate
方法,正如前面解释的那样。

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

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

@谢谢你的回答。我已经更新了帖子。你能不能从表中的外部ID生成一个复合唯一键,然后在重复键更新中使用?@CD001好的,我需要一些帮助:-)我必须测试它,但理论是这样的:你可以在两列上创建唯一索引(链接表中的两个外部ID)-然后插入时,您将设置所有者和属性。。。如果这两个属性与您的唯一复合键匹配,则重复键上的
。。。可以使用UPDATE
。非常好的方法!(谢谢!-ΕΕχαριστώπολύ!)没问题,您可以随时使用它来减少代码的重复,甚至为您的模型创建一个新模型。Τίποτα φίλος ;)这是实际的方法吗?我没有在文档中看到这一点。你能给我指一个参考链接吗?L5的文档很差。L5.1版本上的Taylor将更新文档。探索雄辩的/Model和Builder以找到有趣的方法:)请注意,updateOrCreate()实际上是运行firstOrNew()和save()的一种方便方法,因此会触发两个查询而不是一个查询。
$owner = Owner::updateOrCreate(['property_id' => $id], ['person_id'=>$owner]);