我正在开发一个网站,当用户上传 xml 提要时会生成新内容。视图创建页面,其中 id 是 url 的一部分,例如。news/culture/sa/73
和news/culture/us/79
.
第一个要求是激活单个视图,
我添加了一个活动复选框,在渲染视图之前在控制器中选中该复选框,我想做的是这个。 如果我创建news/culture/sa/74
,并将其设置为活动,则在数据库中它应该选择ID 73(以及所有其他标记为SA的id(并使它们处于非活动状态。
我在控制器中尝试了以下查询:
$culture = Culture::with('saculture.usculture')
->where('id', $cultureId)
->where('template_id', $type)
->where('publish_date', '<=', $now->toDateTimeString())
->where('unpublish_date', '>=', $now->toDateTimeString())
->where('is_live', '=', 1)
->where('id', '<>', $cultureId)
->update('is_live', '=', 0)
->first();
我试图通过上述实现以下目标。 从区域性表中选择 *,其中template_id(即类别 ID(与新创建的 ID 相同。 但是我要更新的是除此ID之外的所有其他ID不处于活动状态。
第二个问题是基于网址的问题。
目前,上传生成的网址具有category_id和帖子 ID:www.site.com/2/1
、www.site.com/2/2
、www.site.com/2/3
... 我想要实现的是以下内容。覆盖 URL,例如www.site.com/2/1
到www.site.com/culture/sa
(这是活动的,用户无法访问其他页面www.site.com/2/2
或www.site.com/2/3
(,因为这些页面将通过第一个查询被禁用。
希望现在更有意义。
$culture = Culture::with('saculture.usculture')
->where('id', $cultureId)
...
->where('id', '<>', $cultureId)
->first();
这在技术上不可能返回任何结果。 id 不能同时等于 $cultureId 和 $cultureId 不同。(至少在你观察它的时候不会;) - 来自薛定谔先生和他的猫的问候(
将 1 个项目标记为活动,并将所有其他项目重置为非活动:
Culture::where('template_id', $type) ->where('id', '<>', $cultureId) ->update(['is_live' => 0]);
不要太担心其他条件。如果某个项目未发布,则只要您只希望单个项目处于活动状态,就可以将其禁用。is_live = 1 检查以仅停用之前处于活动状态的条目(如果我正确理解您的概念,无论如何应该只有 1 个条目(是不必要的。除非必要,否则数据库可以负责不更新行。
覆盖路由
据我了解,这就是您想要实现的目标:
用户打开 www.site.com/2/1,其中 2 是 sa 的template_id,1 不是该类别中的活动区域性。然后,用户被重定向到 www.site.com/culture/sa,这是类别 sa 的当前活动区域性的默认登录页面。
如果 www.site.com/2/1 实际上是 template_id 2 的当前活动区域性,则网站将返回该区域性对象(或其视图(。
这里有一个片段,至少应该概述如何解决这个问题:
Route::get('{templateId}/{cultureId}', function ($templateId, $cultureId) { $activeMatchingCultures = Culture::where('template_id', $templateId)->where('is_active', 1)->first(); if ($activeMatchingCulture->id === $cultureId) { return $activeMatchingCulture; } else { return redirect('/culture/'.$templateId); // You didn't outline how to find the slug for a templateId, you'll have to replace that yourself } })->where(['templateId' => '[0-9]+', 'cultureId' => '[0-9]+']);