2

表の列の(a.paymentDate) 日付はY-m-d H:m:i形式で挿入されます。特定の日付のすべてのエントリを照会したい。そのためには、日付形式をからに変更する必要がありY-m-d H:m:iますY-m-d。私の質問は以下のとおりです。

namespace Regal\SmsBundle\Repository;

use Doctrine\ORM\EntityRepository;


/**
 * DailyTransactionRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class DailyTransactionRepository extends EntityRepository
{
    public function getDailyPayment($studentId,$paymentDate)
    {
        $paymentDate= new \DateTime('2013-03-11');
     $query = $this->getEntityManager()->createQuery("
        SELECT a.id, a.amont, a.paymentDescrip, a.paymentType, a.paymentDate
        FROM RegalSmsBundle:DailyTransaction a 
        WHERE DATE(a.paymentDate) = :paymentDate AND a.students = :studentId
    ")
    ->setParameter('studentId', $studentId)
    ->setParameter('paymentDate', $paymentDate->format('Y-m-d'))
;

return $query->getResult();
    }
}
4

3 に答える 3

3

これを試して、

$query = $this->getEntityManager()->createQuery("
        SELECT a.id, a.amont, a.paymentDescrip, a.paymentType, a.paymentDate
        FROM RegalSmsBundle:DailyTransaction a 
        WHERE DATE(a.paymentDate) = :paymentDate AND a.students = :studentId
    ")
;

$compareTo = new \DateTime('2013-03-11');
$query->setParameters(array(
        'studentId'   => $studentId, 
        'PaymentData' => $compareTo->format('Y-m-d')),
));
    
return $query->getResult();

アップデート、

Date() が認識されないようです。それで、私が共有したコードスニペットが機能するようにします。カスタム DQL 関数を追加し、拡張機能を登録して、Entity Manager に通知する必要があります。

documentationを見てください。よく説明されています。

また、

比較のために DATE_DIFF(date1, date2)を使用することは可能だと思います-それはあなたのニーズに合った日数の違いを与えます。

于 2013-03-19T16:21:59.827 に答える
1

Ahmed の回答を機能させるには (Mysql を使用していると仮定)、ドクトリン拡張を追加する必要があります。

namespace Cerad\Bundle\GameBundle\Doctrine\DQL;

use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;

/**
* "DATE" "(" SimpleArithmeticExpression ")". Modified from DoctrineExtensions\Query\Mysql\Year
*
* @category DoctrineExtensions
* @package DoctrineExtensions\Query\Mysql
* @author Rafael Kassner <kassner@gmail.com>
* @author Sarjono Mukti Aji <me@simukti.net>
* @license MIT License
*/
class Date extends FunctionNode
{
    public $date;

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return "DATE(" . $sqlWalker->walkArithmeticPrimary($this->date) . ")";
    }
    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);

        $this->date = $parser->ArithmeticPrimary();

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }
}

次に、クックブックを調べて、エンティティ マネージャー構成ファイルに dql セクションを追加して拡張機能を有効にする方法を確認します。

于 2013-03-19T16:31:42.683 に答える
1

クエリ ビルダーを使用したローテク アプローチは次のようになります。

class DailyTransactionRepository extends EntityRepository
{
    public function getDailyPayment($studentId,$paymentDate)
    {
        $paymentDate= new \DateTime('2013-03-11');        
        $nextDate = paymentDate;
        $nextDate->modify('+1 day');

        $qb = $this->getEntityManager()->createQueryBuilder( 'a' );
        $qb->andWhere("a.paymentDate > '$paymentDate'");
        $qb->andWhere("a.paymentDate < '$nextDate'");

    return $qb->getQuery()->getResult();
    }
}

部分的なオブジェクトがどうしても必要な場合を除き、フィールドを明示的に選択する必要はありません。すべてのフィールドは、エンティティのゲッターとセッターによって利用可能になります。

于 2013-03-20T17:46:57.940 に答える