Рефакторинг Доктрины DQL / SQL - PullRequest
0 голосов
/ 28 января 2019

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

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

Вывод должен выглядеть следующим образом:

[
   [user_id:1, email: 'main@email.com'],
   [user_id:2, email: 'not-main@email.com'],
]

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

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();
}

1 Ответ

0 голосов
/ 28 января 2019

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

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

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

См. также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...