【问题标题】:Laravel - Delete record from database if not exists in given arrayLaravel - 如果给定数组中不存在,则从数据库中删除记录
【发布时间】:2021-01-12 12:35:00
【问题描述】:

我正在使用 Campbells GitHub package 为 Laravel 获取我所有的 GitHub 存储库。我做了一个命令和一个每分钟运行的 cronjob,它工作得非常好。唯一的问题是,当存储库从 GitHub 中删除时,它会保留在我的数据库中,而不是也被删除。

我遇到了一个名为whereNotIn() 的方法,它检查数据是否不符合指定的输入,您可以对其执行相应的操作。但我似乎无法让它工作。

例如,这个底部表格是 GitHub 存储库和我的数据库中的存储库的列表

GitHub Repos.   |    Website repos

Repo 1          |    Repo 1
Repo 2          |    Repo 2
Repo 3          |    Repo 3
Repo 4          |    Repo 4
                |    Repo 5

您会看到 GitHub 存储库列表比网站存储库少一个,这意味着在 GitHub 端删除了存储库,因此在这种情况下,也需要删除存储库 5 以保持最新的更改.

在命令中处理方法

public function handle() {
        $repos = GitHub::connection('main')->me()->repositories();

        foreach($repos as $repo) {
            $name = str_replace(".", "-", $repo["name"]);

            Project::whereNotIn('name', $name)->delete();

            DB::table('projects')
                ->updateOrInsert(
                    ['name' => $name],
                    [
                        'name' => $name,
                        'html_url' => $repo["html_url"],
                        'description' => $repo["description"],
                        'stargazers_count' => $repo["stargazers_count"],
                        'language' => $repo["language"],
                    ]
                );
        }
}

【问题讨论】:

    标签: php database laravel github cron


    【解决方案1】:

    你可以这样做:

    public function handle() {
        $repos = GitHub::connection('main')->me()->repositories();
        $existingReposNames = [];
    
        foreach($repos as $repo) {
            $name = str_replace(".", "-", $repo["name"]);
            $existingReposNames[] = $name;
            
    
            DB::table('projects')
                ->updateOrInsert(
                    ['name' => $name],
                    [
                        'name' => $name,
                        'html_url' => $repo["html_url"],
                        'description' => $repo["description"],
                        'stargazers_count' => $repo["stargazers_count"],
                        'language' => $repo["language"],
                    ]
                );
        }
    
        Project::whereNotIn('name', $existingReposNames)->delete();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 2021-11-28
      • 1970-01-01
      相关资源
      最近更新 更多