Nano Hash - криптовалюты, майнинг, программирование

Как сделать UNION с Doctrine?

Я пытаюсь сделать следующий запрос:

    public function findByNotifications($ownerId)
    {
        $em = $this->getEntityManager();
        $query = $em->createQuery('
           SELECT n FROM
            (SELECT n FROM DelivveWebBundle:UserAd n
                INNER JOIN n.ad ad
                    WHERE ad.owner = :ownerId
                LIMIT 20
            UNION
            SELECT n FROM DelivveWebBundle:UserAd n
                INNER JOIN n.user u
                INNER JOIN n.ad ad
                   WHERE u.id = :ownerId
                       AND ad.status = :progress
                LIMIT 20)
           notofication
           LIMIT 20;
        ')->setParameter('ownerId', $ownerId)
            ->setParameter('progress', Constant::AD_IN_PROGRESS);

        $result = $query->getResult();

        return $result;
    }

для создания всех моих уведомлений:

    public function showNotificationsAction()
    {
        $this->denyAccessUnlessGranted('ROLE_USER', null, 'Unable to access this page!');

        $owner = $this->getUser();

        $repository = $this->getDoctrine()->getRepository('DelivveWebBundle:UserAd');

        $notifications = $repository->findByAdOwner($owner->getId());

        return $this->render('DelivveWebBundle:Ad:notification.html.twig', array(
            'owner' => $owner,
            'notifications' => $notifications
        ));
    }

Идея состоит в том, чтобы выполнить поиск в таблице AdUser, которая возвращает все уведомления с объявлениями, принадлежащими зарегистрированному пользователю, а также любые уведомления, запрошенные зарегистрированным пользователем.

Уведомление, запрошенное пользователем, представляет собой строку таблицы AdUser, в которой есть столбец, в котором пользователь вошел в систему.

03.09.2015

  • Язык запросов Doctrine не поддерживает ключевое слово UNION. Обходной путь можно найти по адресу stackoverflow.com/questions/4155288/ 03.09.2015
  • Это будет проблемой, и ты знаешь, что это будет какой-то способ сделать то, что я хочу? Ответ от другого pergunda в конечном счете не помог мне, soulação, он разбил свою таблицу на две части, и я не хочу этого, просто хочу создать список с двумя запросами. 03.09.2015
  • Вам нужны первые 20 уведомлений, в которых зарегистрированный пользователь владеет рекламой, а затем первые 20 уведомлений, запрошенных зарегистрированным пользователем? Если это так, я не понимаю, почему вы хотите, чтобы этот результат ограничивался первыми 20 уведомлениями об этих уведомлениях (ваше последнее LIMIT). Является ли «уведомление» n? 03.09.2015
  • Затем ограничение состоит в том, чтобы выбрать 20 первых уведомлений одного вида и еще 20, а затем во внешнем выборе сократить до 20 после того, как 20 из каждого будет иметь 40, это то, что отсутствует заказ по дате обновления, еще не поставленной 03.09.2015
  • Поскольку вы ограничиваете себя 20 уведомлениями, упорядоченными по дате обновления, ограничение дополнительных SELECT до 20 уведомлений не требуется (не имеет значения, есть ли ограничение или нет). (Было бы важно, если бы ваш окончательный порядок отличался от порядка в подчиненных SELECT.) Вы могли бы использовать один SELECT, помещая OR в предложение WHERE. 03.09.2015

Ответы:


1

Я решил разбить два поиска и дать разницу в результатах

public function findByAdOwner($ownerId)
{
    $qb = $this->getEntityManager()->createQueryBuilder('n');

    return $qb->select('n')
        ->from('DelivveWebBundle:UserAd', 'n')
        ->join('n.ad', 'ad')
        ->where('ad.owner = :ownerId')
        ->setParameter('ownerId', $ownerId)
        ->setMaxResults(20)
        ->getQuery()
        ->getResult();
}

public function findByUserNotify($userId)
{
    $qb = $this->getEntityManager()->createQueryBuilder('n');

    return $qb->select('n')
        ->from('DelivveWebBundle:UserAd', 'n')
        ->join('n.ad', 'ad')
        ->where('n.user = :userId')
        ->andWhere('ad.status = :status')
        ->setParameter('userId', $userId)
        ->setParameter('status', Constant::AD_IN_PROGRESS)
        ->setMaxResults(20)
        ->getQuery()
        ->getResult();
}

public function findNotifcations($userId){
    $notification = $this->findByAdOwner($userId);
    $append = $this->findByUserNotify($userId);

    return array_merge($notification, $append);
}

Чтобы сделать текст более читабельным, я просто поставлю после того, что отличает два типа уведомлений, сделать обработку на странице.

Я обнаружил, что есть способ добавить команды в доктрину, которая не существует, но кажется довольно сложной, если кто-нибудь знает, сделайте это, напишите ответ, пожалуйста.

03.09.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..