15

現在、テキスト フィールドとスラッグ フィールドを持つモデルがあります。

スラッグがフォーム リクエスト クラスで一意であることを検証します。

public function rules()
{
    return [
        'name' => 'required|min:3',
        'slug' => 'required|alpha_dash|unique:questions'
    ];
}

これは作成時にうまく機能し、重複したスラッグの作成を適切に拒否します。ただし、更新メソッドでは、スラッグが既に存在するため、レコードを保存できません。もちろんスラッグは存在しますが、編集中のレコードに存在するので、引き続き保存できるようにしたいと思います。ただし、別のレコードではスラッグに変更できないはずです。

私の update ArticlesController メソッドは次のようになります。

public function update(Article $article, ArticleRequest $request)
{
    $article->update($request->all());

    return redirect('articles');
}

L5でこれを機能させる方法はありますか?

4

6 に答える 6

7

次のようにルールを変更してみてください(フォームリクエストクラスで):

public function rules()
{
    return [
      'name'  => 'required,min:3',
      'slug'  => 'required|alpha_dash|unique:categories,slug,'.$this->id')
    ];
}

わたしにはできる。

于 2015-08-28T17:25:58.193 に答える
4

一意のルールでは、無視する ID を指定できます。

2 つの個別のリクエスト (作成用と更新用) を作成できますが、この方法で設定されているかどうかを確認することもできます (更新 URL は次のようになります/questions/2)。

public function rules()
{
    $rules = [
        'name' => 'required|min:3',
        'slug' => ['required', 'alpha_dash']
    ];

    $rule = 'unique:questions';

    $segments = $this->segments();
    $id = intval(end($segments));
    if ($id != 0) {  
         $rule .= ',slug,' . $id;
    }
    $rules['slug'][] = $rule;

    return $rules;
    }
}
于 2015-02-22T21:16:19.503 に答える
2

スラッグを更新する機能が必要な場合、私が取り組んだプロジェクトでは通常、作成後に編集できないようにする必要があります。その後、laravel の組み込みルールを使用して、テーブルの特定のレコードを主キーで無視できます。

$rules['slug'] = "required|unique:questions,slug,{$id}";

http://laravel.com/docs/5.0/validation 「特定の ID を無視する一意のルールを強制する」を参照してください。

于 2015-02-22T21:30:27.660 に答える
1

Laravel 5.3で詳細に行う方法は次のとおりです。

1-ターミナルで次のコマンドを実行して、新しいフォーム リクエストクラスを作成します。

php artisan make:request ArticleFormRequest

ArticleFormRequestフォーム リクエスト クラスの名前はどこにありますか。このコマンドは、ArticleFormRequest.phpin app/Http/Requestsdirectory という名前のファイルを作成します。

2-作成されたファイルを開き、そのコンテンツを削除してから、次のコンテンツを配置します。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\Article;

class ArticleFormRequest extends FormRequest
{
    protected $rules = [
        'name' => 'required|min:3',
        'slug' => 'required|alpha_dash|unique:articles,slug',
    ];

    // protected $user; // in case you want the current authenticated user
    protected $request_method;
    protected $id;

    public function __construct(Request $request)
    {
        // $request->user() returns an instance of the authenticated user
        // $this->user = $request->user(); // in case you want the current authenticated user

        // $request->method() returns method of the request (GET, POST, PUT, DELETE, ...)
        $this->request_method = strtoupper($request->method());

        // segments(): Returns an array containing all of the segments for the request path
        // it is important to assign the returned "segments" array to a variable first before using it, otherwise an error will occur
        $segments = $request->segments();
        // note this way will be valid only if "id" of the element is the last segment
        $this->id = end($segments);
    }

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $rules = $this->rules;

        if ($this->request_method == "POST") {
            // do nothing..
        } elseif (in_array($this->request_method, ["PUT", "PATCH"])) {
            $article = Article::find($this->id);

            if ($article) {
                // forcing a unique rule to ignore a given id | https://laravel.com/docs/5.3/validation
                $rules["slug"] = [
                    "required",
                    "alpha_dash",
                    Rule::unique("articles", "slug")->ignore($article->id, "id"),
                ];

                // this is also can be used
                // $rules['slug'] = "required|alpha_dash|unique:articles,slug,$article->id,id";
            }
        }

        return $rules;
    }
}

3-コントローラーでは、次のような方法ArticleFormRequestでそれstore()を使用できます。update()

<?php

namespace App\Http\Controllers;

use App\Http\Requests\ArticleFormRequest;

class ArticlesController extends Controller
{


    public function store(ArticleFormRequest $request)
    {
        // your code here..
    }

    public function update(ArticleFormRequest $request, $id)
    {
        // Your code here..
    }

}
于 2016-12-21T14:14:26.753 に答える