Доктрина рефакторинга 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 поддерживает работу с различными протоколами, такими как HTTP, FTP и многое другое.


2
62
1

Ответ:

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

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

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

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