cakePHP(v3.x)、containでhasManyアソシエーションを取得する際に特定のフィールドで並び替える。

例えば、AuthorというモデルがhasManyアソシエーションで複数のBooksを持っている時、

以下のようにある特定のidのAuthorに対してcontainsでBooksも取得したい状況において、

function getAuthor($id){
    $condition = ['Authors.id' => $id];
    $contain = ["Books"];
    return $this->find('all')->where($condition)->contain($contain)->first();
}

ひもづくBooksを特定のフィールドで並べておきたいという要求は多くあると思います。

大抵Booksはcreatedで過去のものから順番に並べておきたいので、そのような場合にはAuthorsTableのassociationを以下のように書くと良いです。

public function initialize(array $config){
    // 抜粋
    $this->hasMany(
        'Books',
        [
            'foreignKey' => 'author_id',
            'sort' => ['Books.created' => 'ASC'],
        ]
    );
}

ここでアソシエーションの設定を変更すると、以降oderbyで明示的にアソシエーションを並び変えない限りこのsortで指定した順番でアソシエーションが取得されます。