У меня есть две сущности 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 и многое другое.
Возможно, это не то решение, которое вы ищете, потому что оно на самом деле не использует DQL: вы можете заказать связанную коллекцию по своему флагу isMain
.
class User
{
/**
* @OneToMany
* @OrderBy({"isMain" = "DESC"})
*/
protected $emails;
}
Вызов $emails->first()
всегда будет возвращать основной адрес пользователя, если он есть с основным флагом.
Смотрите также: