1

これがMessageRepositoryの私のDQLクエリです:

public function getLastByIdAndByType($id_employee, $type)
{
    $query = $this->_em->createQuery('SELECT MAX(m.sentAt), m.recipient,   m.author, m.subject, m.body, m.type FROM MyBundle:Message m JOIN m.employee e WHERE e.id = :id_employee AND m.type = :type')
    ->setParameter('id_employee', $id_employee)
    ->setParameter('type', $type)
    return $query->getSingleResult();
}    </code>

In my controller : $last_message=$em->getRepository('MyBundle:Message')->getLastByIdAndByType($id, $type);

In my view html.twig {{ last_message.sentAt }}

returns the error : Item "sentAt" for "Array" does not exist

While

{{ last_message.recipient }} 動作しますが、すべてのメッセージの受信者が同じであることは事実です。

{{last_message.sentAt}}で最新の日付をレンダリングするにはどうすればよいですか?どうもありがとう!

4

1 に答える 1

3

あなたが何を達成したいのか理解しているのなら、あなたは間違ったアプローチを使用しているようです。

関数名で見ると、従業員から送信された最新のメッセージに関する情報を取得したいとします。そのような場合、あなたがしたいのは、sentAtでメッセージを並べ替えて、最初のメッセージだけを選択することです。

実際に行っているのは、実際にはメッセージエンティティの一部ではない計算値を提供する集計関数を使用することです。

これがあなたが望むことをする方法の例です(私はエンティティ全体を取得しているので、ビューで好きなプロパティを使用できることに注意してください-パフォーマンス上の理由から、クエリ):

public function getLastByIdAndByType($id_employee, $type)
{
    $query = $this->_em->createQuery('SELECT m FROM MyBundle:Message m JOIN m.employee e WHERE e.id = :id_employee AND m.type = :type ORDER BY m.sentAt DESC')
                       ->setMaxResults(1)
                       ->setParameter('id_employee', $id_employee)
                       ->setParameter('type', $type);
    return $query->getOneOrNullResult();
}

また、レコードが見つからなかった場合に例外がスローされないように、getSingleResultの代わりにここで行ったようにgetOneOrNullResultを使用できることも注目に値します。純粋に選択の問題ですが、コーディング中にその可能性を念頭に置いていることを意味します。

于 2012-07-07T04:36:22.963 に答える