php - 重构 Doctrine DQL/SQL

标签 php mysql arrays symfony doctrine

我有两个实体 UserEmail,其中一个用户可以有多个电子邮件,其中只有一个可以是主电子邮件。

我想知道是否有 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/

相关文章:

c - 如何将特定大小的二维数组从动态更改为静态?

java - JNI 中的二维 C 数组

php - 包括——使用字符串而不是文件名

php - 如何在 Twig 中对 HTML 转义文本进行 URL 编码?

mysql - 在 MySQL 中,json_search 因 json_array 中的整数元素而失败

c++ - 为什么数组不打印第一个元素?

php - 蛋糕PHP : how to get an array of elements from a web form

php - 如何在 OpenCart 2.3.0.2 中设置全局变量?

mysql - 计算表中 BLOB 列的总数据大小

javascript - 如何在 Express.js 中正确使用 Node-mysql?