2016-12-09 55 views
5

Mam komentarze tabeli:Jak używać unikatowego sprawdzania poprawności w laravel?

enter image description here

mój komentarz kontroler gdzie jej wartości pobieranego z formy i sprawdzanie go i przechowywanie go w bazie danych.

public function store(Request $request, $product_id) 
    { 
     $this->validate($request, array(
      'name' => 'required', 
      'email'=> 'required|email|unique:comments,product_id', 
      'comment' => 'required', 
      'rating' => 'required|integer' 
      )); 
     $product = Product::find($product_id); 
     $comment = new Comment(); 
     $comment->name = $request->name; 
     $comment->email = $request->email; 
     $comment->comment = $request->comment; 
     $comment->rating = $request->rating; 
     $comment->product()->associate($product); 

     $comment->save(); 
     Session::flash('success','Comment was added'); 
     return redirect()->route('product.show',[$product->id]); 
    } 

staram się potwierdzić, że tylko unikalne id e-mail może wypowiedzieć się na temat każdego product_id że jest, jeśli użytkownik już skomentował product_id 1 następnie ten sam użytkownik nie może ponownie wypowiedzieć się na temat tego identyfikatora.

Próbowałem

'email'=> 'required|email|unique:comments,product_id' 

Ale jak u można zobaczyć o tych samych danych email id została wpisana do samego product_id.

Użytkownik może skomentować n numeru strony product_id, ale nie może komentować ponownie po skomentowaniu tego identyfikatora.

Czy istnieje sposób sprawdzenia, czy dane e-mail zostały wprowadzone do bazy danych dla danego id_produktu, wówczas ten sam e-mail nie może przesłać formularza.

enter image description here

Jeśli inny product_id następnie e-mail może wejść.

Dzięki.

Odpowiedz

0

Nie działa w ten sposób zasada unique. Dla swojego zadania musisz utworzyć niestandardową regułę sprawdzania i sprawdzić ręcznie, jeśli użytkownik z tym e-mailem skomentował już ten produkt.

https://laravel.com/docs/5.3/validation#custom-validation-rules

+0

można proszę utworzyć regułę próbki według wyżej problemu, bo nie może dowiedzieć się, jak po przeczytaniu dokumentacji nie jestem tak doświadczony z laravel . Dzięki. – Phoenix

0

Czy spróbować unique_with niestandardowych walidacji. Może to być ten pakiet z pełnym wypełnieniem twoich wymagań. Możesz sprawdzić i uzyskać przykład: here.

0

Nie ma możliwości użycia wielu kolumn dla unikatowej reguły. Musisz to sprawdzić ręcznie, wystrzeliwując zapytanie.

2

napisać to w konsoli

php artisan make:provider ValidationServiceProvider 

Następnie zastąpić App\Providers\ValidationServiceProvider z

namespace App\Providers; 

use Validator; 
use App\Comment; 
use Illuminate\Support\ServiceProvider; 

class ValidationServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap any application services. 
    * 
    * @return void 
    */ 
    public function boot() { 
    Validator::extend('unique_email_comment', function($attribute, $value, $parameters, $validator) { 
     return !Comment::where('email', $value)->where('product_id', $parameters[0])->exists(); 
    }); 
    } 

    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() { 
    // 
    } 
} 

Uwaga: - Upewnij Model App\Comment otrzymuje z przestrzeni nazw modalnego Państwo użyć jako system komentarzy.

Teraz dodaj go do dostawców w config/app.php jak

App\Providers\ValidationServiceProvider::class, 

Teraz można potwierdzić istnienie rzędu przez:

'email' => 'unique_email_comment:' . $productId; 

// or 
// 'email' => 'unique_email_comment:' . request()->get('product_id'); 

Można także dodać własną wiadomość tak

return [ 
    'email.unique_email_comment' => 'A comment has already been made for this product with the email provided'; 
] 

Należy zauważyć, że nie przetestowałem kodu, ale powinno to działać, jeśli wszystkie dane są przekazywane poprawnie, a wszystkie przestrzenie nazw są poprawnie używane.

+0

@Phoenix Cieszę się, że mogę pomóc :) – prateekkathal

+0

gdzie mogę dodać wiadomość niestandardową – Phoenix

+0

Po prostu utwórz niestandardowe '$ messages = [....]' i dodaj je jako trzeci parametr do 'Validator :: make()' jak 'Validator :: make ($ inputs, $ rules, $ messages)' – prateekkathal

0

Możesz użyć zasady sprawdzania poprawności unique. Reference

use Illuminate\Validation\Rule;

$this->validate($request, array(
    'name' => 'required', 
    'email'=> ['required', 'email', Rule::unique('comments', 'email')->where(function($query) { 
        $query->where('product_id', $product_id); 
       })], 
    ... 
)); 

nadzieję, że pomoże Ci