Hvordan hente tilfeldig rad via Doctrine2 querybuilder?

stemmer
7

Så langt jeg har:

$qb1 = $this->getEntityManager()->createQueryBuilder();
            $qb1->select('s')
                ->from('\My\Entity\Song', 's')
                ->where('s.id <> ?1')
                ->orderBy('RAND()', '')
                ->setMaxResults(1)
                ->setParameters(array(1=>$current->id));

Men doctrine2 ikke forstår at:

Error: Expected end of string, got '('

Ikke engang deres querybuilder side har noe på det. Ønsker du å fortelle meg at den beste ORM for php ikke har en tilfeldig funksjon?

Publisert på 05/06/2011 klokken 13:01
kilden bruker
På andre språk...                            


2 svar

stemmer
10

Den orderBy Metoden skal akseptere et felt av Song for sorteringsformål (for eksempel 's.author' eller 's.title'), og ikke en tilfeldig verdi. Selv om du valgte et tilfeldig felt for bestilling, slik som å velge en tilfeldig i php, vil dette ikke være veldig tilfeldig i det hele tatt, fordi du alltid kommer til å få det første resultatet for de gjeldende sorteringskriterier. Hvis sangene dine har 8 felt, vil du bare få 8 forskjellige sanger i søkeresultatene noensinne, selv om du har tusenvis lagret.

Her er et forslag:

$qb1->select('s')
    ->from('\My\Entity\Song', 's')
    ->where('s.id <> ?1')
    ->setMaxResults(1)
    ->setParameters(array(1=>$current->id))
    ->setFirstResult($offset);

Her $ offset kan være en tilfeldig verdi du får tak i php via rand () eller mt_rand () funksjoner. Selvfølgelig $ offset bør være mindre enn det totale antall sanger. Dette er bare et forslag, det er mange måter du kan oppnå dette.

IMHO Jeg tror Doctrine2 er en ekstraordinær ORM, og det er ingenting så avansert som det. Jeg antar du lese spørreverktøyet delen av referansehåndbok, men jeg foreslår også at du leser DQL delen, som forklarer hva er de tilgjengelige funksjoner innenfor Lære spørring system, og hvordan du kan lage din egen (!).

Svarte 05/06/2011 kl. 16:00
kilden bruker

stemmer
3

Du må legge til egendefinerte DQL funksjon RAND. For symfony2 rammeverk kan du bare legge inn config:

doctrine:
    orm:
        entity_managers:
            default:
                dql:
                    numeric_functions:
                        rand: DoctrineExtensions\Query\Mysql\Rand

Og legger til dere avhengigheter i composer.json:

composer require beberlei/DoctrineExtensions

Deretter løsningen for å få 100 tilfeldige AcmeBundle:Itemville virksomheter være så enkelt som:

$em = $this->getContainer()->get('doctrine')->getManager();
$messages = $em->createQueryBuilder()
    ->select('i, RAND() AS HIDDEN r')
    ->from('AcmeBundle:Item', 'i')
    ->orderBy('r', 'ASC')
    ->setMaxResults(100)
    ->getQuery()
    ->getResult();

Merk: Dette forutsetter at du useing MySQL eller mariadb backend. For SQLite eller PostgreSQL må du kanskje et forskjellig implementering klasse.

Svarte 06/09/2015 kl. 10:02
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more