Wpis z mikrobloga

#symfony #php

Mam problem , chce sobie wziąć wszystkich userów z konkretna rolą , zrobiłem sobie następujace zapytanie w repository

/**
* @return User[] Returns an array of User objects
*/

public function findByRole($value):array
{
return $this->createQueryBuilder('u')
->andWhere('u.roles = :val')
->setParameter('val', $value)
->orderBy('u.id', 'ASC')
->getQuery()
->getResult()
;
}

W controlerze mam następujący kod :

$user = $userRepository->findByRole(array('ROLE_TRANS'));
W bazie mam następujących użytkowników jak w obrazku , ale i tak wyrzuca mi pustą tablice ...

Pomocy mirki :_: Na stacku wszędzie są dla starszej wersji ( 4.2.2 mam) albo nie umiem znalezc.
Dawav - #symfony #php

Mam problem , chce sobie wziąć wszystkich userów z konkretna...

źródło: comment_s8cHQgrUb0Kz7LRlGxgoH0wCal0oo8iv.jpg

Pobierz
  • 14
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Dawav: Sprawdź w profilerze jakie realne zapytanie SQL zostało wygenerowane, to ci da podpowiedź, co jest nie tak.

Ale tak czy inaczej w bazie role są trzymane zapewne jako string, także nie można od tak wyszukiwać jak po tablicy.
  • Odpowiedz
@Dawav: zmien to na:
public function findByRole($value):array
{
return $this->createQueryBuilder('u')
->andWhere('u.roles LIKE :val')
->setParameter('val', '%' . $value
  • Odpowiedz
@Dawav: W skrócie masz pewnie zserializowane role w bazie danych, co powoduje, że pisząc samemu zapytanie musisz wyszukiwać ciągu znaków używając LIKE'a co jest mało efektywne.

A procenty są po to, że fraza szukana może znajdować się obojętnie w jakim miejscu danego stringa.
  • Odpowiedz
@Dawav: ja używam elasticsearch, symfony ma nawet do tego bundle'a FOSElasticaBundle - nie musisz zmieniać struktury bazy danych, wystarczy odpowiednio skonstruować indeks, a potem wyszukiwanie będziesz miał i bezproblemowe i wydajne. Polecam
  • Odpowiedz
@satczynsky: @Dawav: A nie trzeba przypadkiem wziąć w cudzysłów? Czyli setParameter('val', '%"' . $value . '"%') (" dookoła $value). Bo jak będzie miał rolę ROLE_USER i ROLE_USER_LUZER i mu znajdzie pierwsze w drugim?
  • Odpowiedz
@Jurigag: Można, zrobić tak jak piszesz, można też, jeżeli chcemy mieć bardziej zaawansowany system podziału na role, trzymać role jako encje i relacyjnie powiązać z użytkownikiem.

Dokumentacja symfony zazwyczaj opisuje najprostsze metody, niekoniecznie najbardziej wydajne.
  • Odpowiedz