Laravel复杂独特的验证脑筋急转弯



我在新工作中遇到了一项任务,无法找到有效的解决方案,还有可能的方法吗。

在我的cms应用程序中,我创建了添加页面的选项。可以为多种语言添加页面。因此,在我的数据库中,我有两个表:

pages
id, is_default, page_parent, published, created_at, updated_at, deleted_at
page_translations
id, page_id, content, slug, locale

(其中locale是语言前缀(en,fr,de…))

所以,在创建页面上,您需要填写每种语言的标题和内容。

管理员用户应该不能创建两个标题相同的页面,所以我创建了一个规则:

private function generateRules() {
foreach (AppModelsSiteLanguages::all() as $language) {
$page = $this->getPageInfoFromRequestByLanguage($language);
$rules[$language->code. '.title'] = 'required|unique:page_translations,title,' . $this->generateRuleAppendix($page);
}
return $rules;
}

private function getPageInfoFromRequestByLanguage($language) {
return $this->get($language->code);
}

private function weAreEditingPage($page) {
return key_exists('id', $page);
}
private function generateRuleAppendix($page) {
$append = '';
if ($this->weAreEditingPage($page)) {
$append = ',' . $page['id'];
}
return $append;
}

本质上,这段代码所做的是检查我们正在编辑的页面,并将标题设置为唯一的。问题是,好吧,它正在工作,你不能添加具有相同名称的页面,但是,如果其他语言标题的标题字段相同,它也不会编辑页面。

因此,如果我编辑页面并为en:Test设置标题名称,为fr:Test设置标题,则页面将不会编辑,因为存在唯一规则。

我需要一种能够在编辑时更新所有语言的标题的方法,这些字段可以是相同的,但不能是具有相同名称的两个页面。

我想你的代码中有拼写错误

private function generateRules() {
foreach (AppModelsSiteLanguages::all() as $language) {
$page = $this->getPageInfoFromRequestByLanguage($language);
$rules[$language->code. '.title'] = 
'required|unique:page_translations,title,' . $this->generateRuleAppendix($page);
}
return $rules;
}

打字错误在这里

unique:page_translations,title,'$这个->。。。

引号中有一个额外的逗号,请尝试删除它,然后再次检查它是否在中工作