Wpis z mikrobloga

Serwus.
Mam w bazie tabelę 'Friends', która przechowuje id 2 userów i pole accepted, jeżeli zaproszenie zostało zaakceptowane i osoby są znajomymi.
Nie chciałem "duplikować" danych i jak mam rekord z userem 1 i userem 2 to nie muszę tworzyć rekordu odwrotnie. I teraz mam problem z pobraniem tych danych w kontrolerze:

Friend::where([
'user_id' => $friend_id,
'friend_id' => Auth::id(),
'accepted' => 1,
])->orWhere([
'user_id' => Auth::id(),
'friend_id' => $friend_id,
'accepted' => 1,
])->get();

To powinno zwrócić konkretny rekord lub jego brak, a zwraca wszystkie elementy z tablicy. Jak porozbijam zapytania na 2 oddzielne to przy założeniu, że rekord istnieje jedno zwróci jeden element, drugie będzie puste.
O co może chodzić? To wina orWhere()?

#php #laravel #naukaprogramowania
  • 14
  • Odpowiedz
@JewelOfTheNile: Where przyjmuje tablicę tablic z tego co widzę.

$users = DB::table('users')->where([
['status', '=', '1'],
['subscribed', '<>', '1'],
])->get();

Przepisz swoje wg tego i zadziała.

Niekoniecznie musisz korzystać z DB:table of kors, chodzi mi o zawartość where.
  • Odpowiedz
@jestem_mike w zakładce dokumentacji znajdziesz wszystko, ewentualnie doczytaj w necie o relacjach. W Twoim przypadku należałoby skorzystać z relacji many to many, czyli tworzysz dodatkową tabelę, która "łączy" obydwu użytkowników, zamiast trzymać to w oddzielnym modelu. Wtedy korzystasz w ten sposób np $user->friends() i masz dostęp do wszystkich przyjaciół użytkownika, zamiast zapytania z dwoma warunkami
  • Odpowiedz
@jestem_mike: Zależy od tego jak ma funkcjonować twoja aplikacja. Jeśli twoim priorytetem jest dużą wydajność bo taki jest jej (aplikacji) "typ" to klep raw. Jeśli nie to ORM, nic się nie stanie jak Ci ucieknie gdzieś parę milisek.
  • Odpowiedz