where('sSlug', 'news')->orWhere('sName', '看看资讯')->get(); if ($existing->isNotEmpty()) { if ($existing->count() !== 1 || $existing[0]->sSlug !== 'news' || $existing[0]->sName !== '看看资讯' || (int) $existing[0]->iParentId !== 0 || (int) $existing[0]->iStatus !== 1) { $this->error('Conflicting news category; inspect before changing it.'); return self::FAILURE; } $this->info('看看资讯 already exists at /news (id '.$existing[0]->id.').'); return self::SUCCESS; } $this->line('Create 看看资讯 at /news, after existing top-level categories.'); if (! $this->option('apply')) return self::SUCCESS; $directory = storage_path('app/private/category-backups'); if (! is_dir($directory)) mkdir($directory, 0700, true); $backup = $directory.'/news-'.Str::uuid().'.json'; $before = DB::table('categories')->orderBy('id')->get(); if (file_put_contents($backup, json_encode($before, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)) === false) { throw new \RuntimeException('Category backup failed.'); } chmod($backup, 0600); $id = DB::transaction(function () { $rows = DB::table('categories')->lockForUpdate()->get(); if ($rows->contains(fn ($row) => $row->sSlug === 'news' || $row->sName === '看看资讯')) { throw new \RuntimeException('Category state changed; rerun after inspection.'); } return DB::table('categories')->insertGetId([ 'iParentId' => 0, 'sName' => '看看资讯', 'sSlug' => 'news', 'sDescription' => '最新资讯与动态。', 'iSort' => $rows->where('iParentId', 0)->max('iSort') + 1, 'iStatus' => 1, 'sHtmlClass' => 'fas fa-newspaper', 'iShowChildren' => 0, 'aBanner' => null, 'aOpt' => null, ]); }); Cache::forget('global_nav_tree'); \Spatie\ResponseCache\Facades\ResponseCache::clear(); $this->info('Created 看看资讯 at /news (id '.$id.'). Backup: '.$backup); return self::SUCCESS; } }