1

電話番号が ではない人null、許可フラグtrue(最初のビルダー呼び出し)、誕生日テンプレートnullがこの関数に含まれていない人を選択するためのビルダーがあります。birthday次のフィールドもあります。

public function getAllForBirthdaySmsSend()
{
    $qb    = $this->getAllSuitableForSmsQueryBuilder();
    $alias = $qb->getRootAlias();
    $today = new \DateTime();

    return $qb->andWhere(
            $qb->expr()->andX(
                $qb->expr()->isNotNull("$alias.sms_birthday_template"),
                /* Filter if today is his birthday */
            ))
    ;
}

これで、誕生日で人をフィルタリングする必要があります。つまり、誕生日の列が'm-d-' . date('Y')equalsとしてフォーマットされている場合です$today

クエリビルダーでこれを行う方法を知っている人はいますか? 私は純粋な SQL クエリを書きたくありませんが、他のクエリ ビルダーを再利用して DRY にすることを好みます。

4

1 に答える 1

1

og を使用して実際のエンティティを処理するために、ネイティブ SQL を使用してからマップすることができますResultSetMapping。残念なことに、YEAR は無視されます。

クエリ フィールドのマッピング:

$rsm = new Doctrine\ORM\Query\ResultSetMapping;

    $rsm->addEntityResult('models\User', 'u');
    $rsm->addFieldResult('u', 'id', 'id');
    $rsm->addFieldResult('u', 'username', 'username');
    $rsm->addFieldResult('u', 'birthday', 'birthday');

ネイティブの日付関数を使用してクエリを作成します (選択した各列がマップされます)。

$query = $this->doctrine->em->createNativeQuery('
    SELECT id, username, birthday 
    FROM user 
    WHERE  TIMESTAMPDIFF(YEAR, birthday, CURRENT_DATE)
    > TIMESTAMPDIFF(YEAR, birthday, CURRENT_DATE - INTERVAL 1 DAY)', $rsm);

ユーザーを取得します。

$users = $query->getResult();

ヒント: クエリを実行する場合は、列の値をキャストしないようにしてください。比較を実行してパフォーマンスを変更する前に、MySQL(あなたの場合)に列をCHARに変換するように強制します。

編集誕生日列は日時型です。ユーザーモデルには、birtdate属性が次のようにマッピングされています\DateTime object

于 2012-08-01T18:05:01.460 に答える