1

私はサイトのヘルプセンターを開発しており、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.

セクション リクエストについても同じことが言えますが、作成している特定のカテゴリにあるセクションのみをチェックする点が異なります。これをテストしたところ、うまくいきました。fooandbarCategory 1andfoobarを挿入できますが、orにCategory 2別のものを追加しようとすると、重複しているため検証されません。これは正しいことです。しかし、更新しようとすると許可されず、変更を加えずに更新しようとすると、それ自体 (行) が無視され、検証エラーがスローされなくなります。したがって、すべてがこのために必要なように機能します。fooCategory 1Category 2fooCategory 1barfoo

記事の検証では、セクションの検証とまったく同じプロセス/クエリの検証を使用しましたが、次のように、テーブル/列/変数を適切に変更しています。

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 つだけ許可し、カテゴリの異なるセクションで同じタイトルの記事を許可します。その部分は正常に機能しますが、 と を挿入foobarCategory 1 / Section 1から更新fooすると、変更が許可され、私には、 に既に存在するbarため、そうすべきではありません。barCategory 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.
4

1 に答える 1

1

まず第一に、あなたのコードは分析が難しいです。もし私があなたなら、そのために配列構文を使用します。

   $rules = [
        'title' => ['required'. 'min:3'],
   ];
   $uniqueRule = 'unique:help_centre_categories';

   /* Update ------------------------------------- */
    if ($method == 'PATCH') {
       $uniqueRule.='title,'.$this->category->id
    }
    $rules['title'][] = $uniqueRule;

2 つ目は、$method変数です。どこから来たのかはわかりませんが、正しい値を保持していると仮定すると、おそらく次のように条件を変更する必要があります。

if (strtoupper($method) == 'PATCH' || strtoupper($method) == 'PUT') {
 ...
}

最後にRequest、ストアと更新の両方に 1 つのクラスを使用しようとする場合、通常は次のようにします。

$segments = $this->segments();
$id = intval(end($segments));
if ($id != 0) {
 // now you know it's update
}

あなたの方法がうまくいかない場合は、上記の方法を試すことができます。

編集

オブジェクト内では、メソッドRequestを使用できますgetMethod()。次に例を示します。

public function rules() 
{
   $method = $this->getMethod();
   if ($method == 'PUT' || $method == 'PATCH') {
        // now you do what you want for update
   }

   // rest of code goes here
}

更新するには、$method がPUTまたはPATCH

于 2015-03-22T08:52:53.100 に答える