Jak najlepiej sprawdzić czy user dodał opinię?

Jak najlepiej sprawdzić czy user dodał opinię?
KL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
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

Kopiuj
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?).

Kopiuj
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?

B1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
1

tabela reviews:
| id | id_user | id_place |

Kopiuj
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
KL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
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?

Kopiuj
Route::get('/places/{place}/reviews/{user}', [PlaceReviewController::class, 'getReviewByUser']);
B1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
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
Kopiuj
Route::get('/places/reviews/{user}', [PlaceController::class, 'GetAllByUserWithReviews']);

Tak z grubsza rzecz biorac :D

B1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
1

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

Kopiuj
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.

masterc
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 425
0

W modelu Place.php dodajesz relacje

Kopiuj
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

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.