0

symfony2 内で mysql クエリを教義に変換しようとしています。

これがmysqlクエリです。

SELECT * FROM referrals r
INNER JOIN domain d ON LOWER(d.domain) = LOWER(SUBSTRING_INDEX(r.email, '@', -1))
LEFT OUTER JOIN user_referrals ur ON ur.referral_id = r.referral_id AND ur.user_id = 1
WHERE LOWER(d.domain) = LOWER('Gmail.com') AND ur.referral_id IS NULL
ORDER BY r.suggestion_count ASC LIMIT 5;

これが私の教義への変換です。

$em = $this->getDoctrine()->getManager();
        $query = $em->createQuery(
            'Select r From FuelFormBundle:Referrals r
            INNER JOIN FuelFormBundle:Domain d WITH d.domain = LOWER(SUBSTRING_INDEX(r.email, "@", -1))
            LEFT OUTER JOIN FuelFormBundle:UserReferrals ur WITH ur.referral_id = r.referral_id AND ur.user_id = :userId
            WHERE LOWER(d.domain) = LOWER(:domain) AND ur.referral_id IS NULL
            ORDER BY r.suggestion_count ASC'
        )->setParameters(array(
                'domain', $domain['email'],
                'userId' => $currentUserId))
            ->setMaxResults(5);

        $referral = $query->getResult();

これを実行したときに表示されるエラー メッセージは次のとおりです。

[Syntax Error] line 0, col 110: Error: Expected known function, got 'SUBSTRING_INDEX'

スタックトレースは

1 error
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelRequest".
DEBUG - Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\SessionListener::onKernelRequest".
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\FragmentListener::onKernelRequest".
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest".
INFO - Matched route "ajax_get_five_emails" (parameters: "_controller": "Fuel\FormBundle\Controller\DatabaseController::getFiveEmailsWithSameDomainAction", "_route": "ajax_get_five_emails")
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest".
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\Security\Http\Firewall::onKernelRequest".
DEBUG - Notified event "kernel.request" to listener "Symfony\Bundle\AsseticBundle\EventListener\RequestListener::onKernelRequest".
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ErrorsLoggerListener::injectLogger".
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ErrorsLoggerListener::injectLogger".
DEBUG - Notified event "kernel.controller" to listener "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController".
DEBUG - Notified event "kernel.controller" to listener "Acme\DemoBundle\EventListener\ControllerListener::onKernelController".
DEBUG - Notified event "kernel.controller" to listener "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController".
DEBUG - Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController".
DEBUG - Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController".
DEBUG - Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController".
DEBUG - Notified event "kernel.exception" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelException".
DEBUG - Notified event "kernel.exception" to listener "Symfony\Component\HttpKernel\EventListener\ExceptionListener::onKernelException".
CRITICAL - Uncaught PHP Exception Doctrine\ORM\Query\QueryException: "[Syntax Error] line 0, col 110: Error: Expected known function, got 'SUBSTRING_INDEX'" at /vagrant/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php line 44
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelRequest".
DEBUG - Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\SessionListener::onKernelRequest".
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\FragmentListener::onKernelRequest".
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest".
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest".
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\Security\Http\Firewall::onKernelRequest".
DEBUG - Notified event "kernel.request" to listener "Symfony\Bundle\AsseticBundle\EventListener\RequestListener::onKernelRequest".
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ErrorsLoggerListener::injectLogger".
DEBUG - Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ErrorsLoggerListener::injectLogger".
DEBUG - Notified event "kernel.controller" to listener "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController".
DEBUG - Notified event "kernel.controller" to listener "Acme\DemoBundle\EventListener\ControllerListener::onKernelController".
DEBUG - Notified event "kernel.controller" to listener "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController".
DEBUG - Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController".
DEBUG - Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController".
DEBUG - Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController".

クエリビルダーを使用しようとしましたが、左外部結合を行う方法と Substring_index で同じ問題を見つけることができないようです。

何か案は?


編集:

に置き換えましsubstring_indexたがLOWER(SUBSTRING(r.email, LOCATE('@', r.email ,1)))、これまでのところ構文を受け入れているようです。


編集2:

最後の答えはかなり近いですが、私は少しずれています。答えはLOWER(SUBSTRING(r.email, LOCATE('@', r.email)+1))

私が問題を理解したら、LEFT OUTER JOIN私はそれを投稿します。
私はこれを見つけました

フェッチ結合: 通常の結合の使用に加えて、関連するエンティティをフェッチし、それらをクエリの水和結果に含めるために使用されます。

通常の結合とフェッチ結合を区別する特別な DQL キーワードはありません。結合 (内部結合または外部結合) は、結合されたエンティティのフィールドが集計関数の外側の DQL クエリの SELECT 部分に現れるとすぐに、「フェッチ結合」になります。それ以外の場合は、「通常の結合」です。

しかし、それに専念する時間はもうありません。

上記の引用のリンクは次のとおりですhttp://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#dql-functions

4

0 に答える 0