Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 重构DQL/SQL_Php_Mysql_Arrays_Symfony_Doctrine - Fatal编程技术网

Php 重构DQL/SQL

Php 重构DQL/SQL,php,mysql,arrays,symfony,doctrine,Php,Mysql,Arrays,Symfony,Doctrine,我有两个实体User和Email,其中一个用户可以有多封电子邮件,其中只有一封可以是主电子邮件 我想知道是否有DQL查询来选择主电子邮件(如果存在),否则它会选择第一个非主电子邮件 输出应如下所示: [ [user_id:1, email: 'main@email.com'], [user_id:2, email: 'not-main@email.com'], ] 提前谢谢 class User { /** @OneToMany */ protected $em

我有两个实体
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()
将始终返回用户的主地址(如果存在带有主标志的主地址)


另请参见:

hey@simon.ro谢谢您的提示,这将帮助我重构代码,我不知道
@OrderBy