IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Vyhledání pomocí DQL dotazu. Doctrine 2

Aktivity
Avatar
Kryštof Grůň:3.8.2017 12:47

Zdravím, potřeboval bych pomoct v jedním DQL dotazem.
Mám na stránce vyhledávací formulář. Po jeho odeslání zavolám tuhle funkci

public function searchAll($text)
{
    return $this->em->createQuery('
        SELECT PARTIAL user.{id,username,route}, PARTIAL settings.{id, description}, PARTIAL article.{id, title, description}, PARTIAL category.{id, name, description}
        FROM App\Model\Entities\User user
        INNER JOIN user.settings settings
        JOIN App\Model\Entities\Article article
        JOIN App\Model\Entities\Category category
        WHERE user.username = %:param%, article.title  = %:param%, category.name = %:param%
        LIMIT 5
    ')
        ->setParameter('param', $text)
        ->getResult();
}

funkce bere jako parametr vyhledávaný výraz.
Jen chci aby mi to našlo z tabulek user, article a category všechny entity, které mají v názvu vyhledávaný výraz.
Po spuštění tohoto kódu dostanu

Doctrine\ORM\Query\QueryException

[Syntax Error] line 0, col 368: Error: Expected =, <, <=, <>, >, >=, !=, got 'category' search►

Mohli byste mi prosím pomoct s opravením toho kódu?
Ještě bych poprosil o vysvětlení objektu, který mi to vyhodí po dokončeném, dotazu.
Jestli se ke kategoriím dostanu třeba takto:

foreach result['category'] as category
...

nebo jak.
Předem vám moc děkuji za všechny rady a doporučení, které mi poskytnete.

Editováno 3.8.2017 12:47
 
Odpovědět
3.8.2017 12:47
Avatar
Odpovídá na Kryštof Grůň
Martin Konečný (pavelco1998):3.8.2017 13:45

Ahoj,
mám takový pocit, že v DQL nepůjde JOINovat entity, které spolu nemají žádný vztah, ale možná by mohlo fungovat něco jako

return $this->em->createQuery('
        SELECT PARTIAL user.{id,username,route}, PARTIAL settings.{id, description}, PARTIAL article.{id, title, description}, PARTIAL category.{id, name, description}
        FROM App\Model\Entities\User user
        INNER JOIN user.settings settings
        JOIN App\Model\Entities\Article article WITH user.username = article.title
        JOIN App\Model\Entities\Category category WITH user.username = category.name
        WHERE user.username = %:param%
    ')
        ->setParameter('param', $text)
        ->setMaxResults(5)
        ->getResult();

Entity, které k sobě nemají relaci, lze spojovat pomocí operátoru WITH, viz http://docs.doctrine-project.org/…anguage.html (můžeš to najít pomocí řetězce "Joins between entities without associations were not possible ...").
Ovšem zde je problém, že by se jméno usera muselo přesně shodovat s názvem článku / kategorie, což není úplně to, co chceš.
Nevím, zda v DQL vůbec půjde to, co chceš, určitě by ale mělo jít to vyhledat v čistém SQL a pokud potřebuješ entity, tak je pak namapovat ručně (zábavná práce).

Nahoru Odpovědět
3.8.2017 13:45
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Jan Blažek
Tvůrce
Avatar
Jan Blažek:3.8.2017 22:34

Ahoj, původně jsem se chtěl zeptat v samostatném vlákně, ale když už je to tady tak nakouslí ...
S tím %, nevíš jak se to dělá v DQL ? Když to napíšu do toho dotazu, tak dostanu

[Syntax Error] line 0, col 222: Error: Expected Literal, got '%'

ale když to dám z tomu parametru.

->setParameter('category', %$parameter%)

tak mi to nikdy nic nenajde kategorii 'test', když zadám 't'

Editováno 3.8.2017 22:35
 
Nahoru Odpovědět
3.8.2017 22:34
Avatar
Odpovídá na Jan Blažek
Martin Konečný (pavelco1998):3.8.2017 22:42
->setParameter('category', "%{$parameter}%")
Nahoru Odpovědět
3.8.2017 22:42
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kryštof Grůň:4.8.2017 9:50

Jsi si jistý, že je to správně? U mého vyhledávání to nefunguje.:/

 
Nahoru Odpovědět
4.8.2017 9:50
Avatar
Odpovídá na Kryštof Grůň
Martin Konečný (pavelco1998):4.8.2017 11:25

Co konkrétně jestli je správně?

Nahoru Odpovědět
4.8.2017 11:25
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Jan Blažek
Tvůrce
Avatar
Jan Blažek:4.8.2017 12:46

Ahoj, nevím, jestli to píšu nějak špatně, ale mě to

->setParameter('category', "%{$parameter}%")

nikdy nic nenajde, Ani když mám v databázi 'test' a zadám jako parametr něco z toho slova, třeba ('e', 't','test'). Ale když tam dám jen

->setParameter('category', "$parameter")

a zadám 'test', tak mi to vyhledá

 
Nahoru Odpovědět
4.8.2017 12:46
Avatar
Odpovídá na Jan Blažek
Martin Konečný (pavelco1998):4.8.2017 13:31

A jak vypadá přesně ten tvůj dotaz?

Nahoru Odpovědět
4.8.2017 13:31
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Jan Blažek
Tvůrce
Avatar
Jan Blažek:4.8.2017 14:02
return $this->em->createQuery('
    SELECT PARTIAL category.{id, route, description, name}
    FROM App\Model\Entities\Category category
    WHERE category.name = :name
')
    ->setParameter('name', "%{$searchText}%")
    ->setMaxResults($limit)
    ->getResult();

když tam mám ty procenta, tak mi to nenajde kategorii s názvem "category", i když zadám její celý název. Když tam ty procenta nedám a zadám celý název, tak se kategorie najde.

 
Nahoru Odpovědět
4.8.2017 14:02
Avatar
Odpovídá na Jan Blažek
Martin Konečný (pavelco1998):4.8.2017 15:13

Dej tam

WHERE category.name LIKE :name

a mělo by to být ok :)

Nahoru Odpovědět
4.8.2017 15:13
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Jan Blažek
Tvůrce
Avatar
Jan Blažek:4.8.2017 20:00

:D Dík. Musím říct, že na to jsem úplně zapomněl :)

 
Nahoru Odpovědět
4.8.2017 20:00
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.