Jak najlepiej sprawdzić czy user dodał opinię?

0

Nigdy wcześniej nie potrzebowałem dodawać ograniczenia do jednego rekordu na usera I nie wiem jak najlepiej do tego podejść :D

Korzystam z Laravela.
Aktualnie mam dwie trasy

Route::get('/places/{place}/reviews', [PlaceReviewController::class, 'index']);
Route::get('/places/{place}/reviews/statistics', [PlaceReviewController::class, 'statistics']);

Pierwsza trasa zwraca mi tam ileś rekordów z recenzjami, a druga zwraca ilość wszystkich recenzji i średnią ocenę.

Jak teraz najlepiej sprawdzić czy zalogowany użytkownik już dodał opinię?
Stworzyć nową trasę np (nawet nie wiem jak to nazwać, jakieś propozycje?).

Route::get('/places/{place}/reviews/is-posted?', [PlaceReviewController::class, 'isPosted']);

i po prostu w ten sposób sprawdzać? Czy może lepiej do którychś danych z pierwszej lub drugiej trasy dołączać informacje o tym czy zalogowany użytkownik już dodał recenzje?

1

tabela reviews:
| id | id_user | id_place |

Route::get('/review/{id_user}/{id_place}', [ReviewController::class, 'GetByUserAndPlace']);
Route::get('/reviews/{id_user}', [ReviewController::class, 'GetAllByUser']);

Zakladajac ze dla dwoch kolumn: id_user oraz id_place masz index unique:

  1. otrzymujesz opinie usera o okreslonym miejscu
  2. otrzymujesz wszystkie opinie usera
0

Ale to właśnie potrzebuje w drugą stornę. Wszystkie opinie o danym miejscu + sprawdzanie czy user dodał opinie. Czyli zrobić coś w tym stylu?

Route::get('/places/{place}/reviews/{user}', [PlaceReviewController::class, 'getReviewByUser']);
2

W takim razie:

  1. albo w momencie dodawania nowego miejsca, musiz w transakcji dodawac nowe rekordy do tabeli reviews dla wszystkich user'ow tzn z wymaganym id_user i niewymaganym id_place - troche overkill :D, ale banalny right join chociaz tabela reviews ogromniasta :D
  2. albo wykonujesz dwa zapytania:
    -1- pobierasz wszystkie miejsca: $places
    -2- pobierasz wszystkie opnie uzytkownika na temat wszystkich miejsc na temat ktorych skladal opinie : $userReviews
    i przed wyswietleniem w petli przypisujesz do kazdego $place odpowiedni $userReview o ile istnieje
Route::get('/places/reviews/{user}', [PlaceController::class, 'GetAllByUserWithReviews']);

Tak z grubsza rzecz biorac :D

1

Najlepsza bedzie jednak nastepujaca opcja. Takie zapytanie z grubsza powinno zalatwic sprawe:

SELECT id FROM `places` WHERE id NOT IN  (SELECT id_place FROM `reviews` WHERE id_user = 'jakis_user')

Dostaniesz w wyniku wszystkie miejsca na ktorych temat user nie wyrazil opinii.

0

W modelu Place.php dodajesz relacje

public function reviews() {
        return $this->hasOne('App\Models\User', 'id', 'user_id');
    }

public function isPosted() : bool {
        return ($this->reviews) ? true : false;
    }

i potem w collection /places/{place}/reviews masz

foreach($reviews as $review) {
    $review->isPosted(); 
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1