我有两个实体 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();
}
最佳答案
可能不是您正在寻找的解决方案,因为它实际上不使用 DQL:您可以通过 isMain
标志来订购关联的集合。
class User
{
/**
* @OneToMany
* @OrderBy({"isMain" = "DESC"})
*/
protected $emails;
}
调用 $emails->first()
将始终返回用户的主地址,如果有主地址的话。
另见:
关于php - 重构 Doctrine DQL/SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54395644/