我接受了新工作的任务,无法找出有效的解决方案,也有可能实现这一目标。
在我的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 (\App\Models\SiteLanguages::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 的标题,则由于唯一规则,页面将无法编辑
我需要一种能够在所有语言的编辑时更新标题的方法,这些字段可以是相同的,但它不能是同名的两个页面。
答案 0 :(得分:-1)
我猜您的代码中存在拼写错误
private function generateRules() {
foreach (\App\Models\SiteLanguages::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,'。 $这 - > ...
引用内部额外的逗号,尝试将其删除并再次检查它是否正常工作