シムノート

PHPフレームワークSymfonyの学習帳

ユーザ用ツール

サイト用ツール


サイドバー

メニュー



このエントリーをはてなブックマークに追加

blog:2016-01-01:doctrine入門_number_of_bugs

Doctrine入門 : (7) バグの数

今までの所、DBからのデータの取得はエンティティオブジェクトか配列でしか行っていません。DoctrineはDQLを使って、ただの値の取得もサポートしています。これらの値は「スカラー値」(scalar result values)と呼ばれていています。COUNTSUM, MIN, MAX, AVG関数等の結果もスカラーとして扱います。

ここでは、スカラーを使ってProduct毎のBugの件数を取得してみます。

Controllerの修正

ProductController.phpを以下のように修正します。

// ...
class ProductController extends Controller
{
    // ...
    public function indexAction()
    {
        $em = $this->getDoctrine()->getManager();

        $dql = "SELECT p.id, p.name, count(b.id) AS openBugs FROM AppBundle:Bug b ".
               "JOIN b.products p WHERE b.status = 'OPEN' GROUP BY p.id";
        $products = $em->createQuery($dql)->getScalarResult();
        // 以下の書き方でも getScalarResult() と同様の結果になります
        // $products = $em->createQuery($dql)
        //     ->setHydrationMode(Query::HYDRATE_SCALAR)->getResult();

        dump($products);

        return $this->render('product/index.html.twig', array(
            'products' => $products,
        ));
    }
    // ...
}

Viewの修正

product/index.html.twigを以下のように修正します。

{% extends 'base.html.twig' %}

{% block body %}
    <h1>Product list</h1>

    <table class="table table-striped table-hover table-bordered">
        <thead>
            <tr>
                <th>Id</th>
                <th>Name</th>
                <th>Open bugs</th>
                <th>Actions</th>
            </tr>
        </thead>
        <tbody>
        {% for product in products %}
            <tr>
                <td><a href="{{ path('product_show', { 'id': product.id }) }}">{{ product.id }}</a></td>
                <td>{{ product.name }}</td>
                <td>{{ product.openBugs }}</td>
                <td>
                    <a href="{{ path('product_show', { 'id': product.id }) }}" class="btn btn-default btn-xs" role="button">show</a>
                    <a href="{{ path('product_edit', { 'id': product.id }) }}" class="btn btn-primary btn-xs" role="button">edit</a>
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>

    <a href="{{ path('product_new') }}" class="btn btn-primary" role="button">Create a new entry</a>
{% endblock %}

動作確認

http://localhost:8000/product にアクセスしてバグの件数が表示されていることを確認します。

また、コントローラーに仕込んだdump()の出力も確認してみてください。


Comments



202 +14 = ?
blog/2016-01-01/doctrine入門_number_of_bugs.txt · 最終更新: 2016/01/20 06:58 by tsubo