首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >保存或创建新记录,如果不存在,使用雄辩

保存或创建新记录,如果不存在,使用雄辩
EN

Stack Overflow用户
提问于 2020-03-27 15:07:20
回答 2查看 41关注 0票数 0

我递归地调用一个函数,该函数向DB插入新记录,但也从DB的某些部分中删除。为了更好地理解我,我提供我的职能:

代码语言:javascript
代码运行次数:0
运行
复制
public function updateUserMailQueue($data, $user_id) {
    if(!array_key_exists('mail_queue', $data)) return;
    $queues = preg_replace('/[^0-9,]/', '', $data['mail_queue']);
    $queues = explode(',', $queues);
    sort($queues);
    foreach($queues as $queue) {
        if(empty($queue)) continue;
        $existing = MailQueue::zQuery()->where('order', $queue)->first();
        if(empty($existing)) {
            $existing = new MailQueue();
            $existing->order = $queue;
        } else if($existing->user_id != $user_id) {
            $this->updateUserMailQueue(['mail_queue' => $existing->order + 1], $existing->user_id);
        }
        $existing->user_id = $user_id;
        $existing->save();
    }
    MailQueue::zQuery()->where('user_id', $user_id)->whereNotIn('order', $queues)->delete();
}

我试图通过这个功能实现的是创建邮件发送给用户的优先级顺序(较低的数量、更高的优先级)。我之所以使用递归,是因为如果更改了顺序,优先级为4的用户变为1,则需要更改所有其他用户的优先级顺序。在像现在这样编写的函数中,我面临的问题是,函数的最后一行删除以前在调用中分配的$existing记录,因此,一旦返回到该调用,接下来的两行将被调用:$existing->user_id = $user_id; $existing->save();,但是由于表中不再存在$existing记录,所以不会保存任何内容,但也不会抛出错误。现在,我想知道的是,对于这类问题,是否存在类似->saveOrCreate()而不是->save()的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-27 15:41:35

如果我正确理解,你需要有说服力的updateOrCreate方法,

您还可能遇到这样的情况:您想要更新现有模型,或者创建新模型(如果不存在的话)。Laravel提供了一种updateOrCreate方法来一步完成这一工作。与firstOrCreate方法一样,updateOrCreate保存模型,因此不需要调用():

代码语言:javascript
代码运行次数:0
运行
复制
// If there's a flight from Oakland to San Diego, set the price to $99.
// If no matching model exists, create one.
$flight = App\Flight::updateOrCreate(
  ['departure' => 'Oakland', 'destination' => 'San Diego'],
  ['price' => 99, 'discounted' => 1]
);

它是如何工作的?:

代码语言:javascript
代码运行次数:0
运行
复制
App\YourModel::updateOrCreate(
  param1,
  param2
);

如果param2匹配param1(Array)中的所有键和值,则该行将由key=>values更新(不需要为param2重复param1键值),否则将创建一个新行。

票数 0
EN

Stack Overflow用户

发布于 2020-03-27 15:22:02

您可以使用updateOrCreate方法提供的拉拉。

示例:如果有从奥克兰飞往圣地亚哥的航班,价格定在99美元。如果不存在,它将创建一个新的。

代码语言:javascript
代码运行次数:0
运行
复制
$flight = App\Flight::updateOrCreate(
     ['departure' => 'Oakland', 'destination' => 'San Diego'],
     ['price' => 99, 'discounted' => 1] );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60888700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档