Доктрина рефакторинга DQL/SQL

У меня есть две сущности User и Email, где у пользователя может быть несколько электронных писем, из которых только одно может быть основным.

Я хочу знать, есть ли запрос DQL для выбора основного электронного письма, если он существует, в противном случае он выбирает первое неосновное электронное письмо.

Вывод должен быть таким:

[
   [user_id:1, email: '[email protected]'],
   [user_id:2, email: '[email protected]'],
]

Заранее спасибо.

class User 
{ 
    /** @OneToMany */
    protected $emails;
}

class Email 
{
    /** @boolean */
    protected $isMain = 0;

    /** @ManyToOne */
    protected $user;
}

Существующее решение, которое я пытаюсь преобразовать в DQL:

public function getMainEmail(): ?string
{
    $emails = $this->getEmails();

    if (empty($emails) || 0 === \count($emails)) {
        return null;
    }

    /** @var Email $email */
    foreach ($emails as $email) {
        if (1 === $email->getMain()) {
            return $email->getEmail();
        }
    }

    return $emails->first()->getEmail();
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
62
1

Ответы 1

Возможно, это не то решение, которое вы ищете, потому что оно на самом деле не использует DQL: вы можете заказать связанную коллекцию по своему флагу isMain.

class User 
{ 
    /** 
    * @OneToMany 
    * @OrderBy({"isMain" = "DESC"})
    */
    protected $emails;
}

Вызов $emails->first() всегда будет возвращать основной адрес пользователя, если он есть с основным флагом.

Смотрите также:

эй @simon.ro спасибо за советы, это поможет мне реорганизовать мой код, я не знал о @OrderBy

yoeunes 28.01.2019 16:47

Другие вопросы по теме