CakePHP(v3.x)、collectionを用いてアソシエーションを組んだモデルの要素の合計を計算する

今、アソシエーションにおいて、”Books” belongsTo “Author”という状況を考えます。

ある、Authorを名前で指定して、そのAuthorの持つBooksについて、その本の金額の総和を求めたいとき、collectionクラスにあるメソッドを利用すると便利です。

クエリを実行して、

$query = $authors->find("all")->where(["name" => "J. K. Rowling"])->contain(["Books"]);

下のようなデータが得られるとします。

// Author
{
    "name" => "J. K. Rowling"
    "books" => [
        {
            "title" => "Harry Potter I",
            "price" => 100
        },
        {
            "title" => "Harry Potter II",
            "price" => 200
        },
    ]
}

ここから本の金額の合計を算出する時、ここにあるメソッドを参考に

$total_price = $query->extract("books.{*}.price")->sumOf();

などでいけると思います。