私はサイトのヘルプセンターを開発しており、Laracast フォーラムで質問をしましたが、残念ながらまだ解決策がありません。ここでは、そのルート/URL パスを示します。
ルート.php
Route::resource('admin/help-centre/category', 'AdminHelpCentreCategoryController');
Route::resource('admin/help-centre/category/{category}/section', 'AdminHelpCentreSectionController');
Route::resource('admin/help-centre/category/{category}/section/{section}/article', 'AdminHelpCentreArticleController');
カテゴリとセクションの検証は期待どおりに機能していますが、何らかの理由で同じロジックであっても、私が知る限り、記事の検証は期待どおりに機能していないようです。これが私の検証ルールです(余分なものを削除し、タイトルフィールドを残しました):
HelpCentreCategoryRequest.php
/* Insert ------------------------------------- */
$rules = [
'title' => 'required|min:3|unique:help_centre_categories',
];
/* Update ------------------------------------- */
if ($method == 'PATCH') {
$rules = [
'title' => 'required|min:3|unique:help_centre_categories,title,'.$this->category->id,
];
}
HelpCentreSectionRequest.php
/* Insert ------------------------------------- */
$rules = [
'title' => 'required|min:3|unique:help_centre_sections,title,NULL,id,category_id,'.$this->category->id,
];
/* Update ------------------------------------- */
if ($method == 'PATCH') {
$rules = [
'title' => 'required|min:3|unique:help_centre_sections,title,'.$this->section->id.',id,category_id,'.$this->category->id,
];
}
明確にするために説明します...カテゴリのINSERT
場合、そのタイトルが既に存在するかどうかを確認し、存在する場合は検証しません。UPDATE
タイトルが変更されていないかどうかを検証できるように、チェックでそれ自体を無視することを除いて、まったく同じことを行います。だから私は2つのカテゴリを入力しました.1つは呼び出されCategory 1
、もう1つはCategory 2
.
セクション リクエストについても同じことが言えますが、作成している特定のカテゴリにあるセクションのみをチェックする点が異なります。これをテストしたところ、うまくいきました。foo
andbar
にCategory 1
andfoo
とbar
を挿入できますが、orにCategory 2
別のものを追加しようとすると、重複しているため検証されません。これは正しいことです。しかし、更新しようとすると許可されず、変更を加えずに更新しようとすると、それ自体 (行) が無視され、検証エラーがスローされなくなります。したがって、すべてがこのために必要なように機能します。foo
Category 1
Category 2
foo
Category 1
bar
foo
記事の検証では、セクションの検証とまったく同じプロセス/クエリの検証を使用しましたが、次のように、テーブル/列/変数を適切に変更しています。
HelpCentreArticleRequest.php
/* Insert ------------------------------------- */
$rules = [
'title' => 'required|min:3|unique:help_centre_articles,title,NULL,id,section_id,'.$this->section->id,
];
/* Update ------------------------------------- */
if ($method == 'PATCH') {
$rules = [
'title' => 'required|min:3|unique:help_centre_articles,title,'.$this->article->id.',id,section_id,'.$this->section->id,
];
}
これは とまったく同じように行う必要があるHelpCentreSectionRequest.php
ため、カテゴリの各セクションで記事タイトルのコピーを 1 つだけ許可し、カテゴリの異なるセクションで同じタイトルの記事を許可します。その部分は正常に機能しますが、 と を挿入foo
しbar
てCategory 1 / Section 1
から更新foo
すると、変更が許可され、私には、 に既に存在するbar
ため、そうすべきではありません。bar
Category 1 / Section 1
私は明らかに間違っていますが、それ以外の場合は、期待どおりに機能します。しかし、私は問題が何であるかを見ることができませんか?
手間を省くためのデータベーススキーマを次に示します。テーブル/列名が一致していることを確認できます (ここでも外部キーと余分な列が削除されています)。
Schema::create('help_centre_categories', function(Blueprint $table)
{
$table->increments('id')->unsigned();
$table->string('title');
});
Schema::create('help_centre_sections', function(Blueprint $table)
{
$table->increments('id')->unsigned();
$table->integer('category_id')->unsigned();
$table->string('title');
});
Schema::create('help_centre_articles', function(Blueprint $table)
{
$table->increments('id')->unsigned();
$table->integer('category_id')->unsigned();
$table->integer('section_id')->unsigned();
$table->string('title');
});
if
また、上部の Laracast フォーラムのリンクで言及されている記事のリクエストが確実に起動しているというステートメントも確認しました。Valiation docs hereも見つけることができますが、読みやすいように、これは私が使用している主要なセクションです。
Adding Additional Where Clauses
You may also specify more conditions that will be added as "where" clauses to the query:
'email' => 'unique:users,email_address,NULL,id,account_id,1'
In the rule above, only rows with an account_id of 1 would be included in the unique check.