cakePHP(v3.x)、Entityのうち、hasManyのアソシエーションが条件に全一致しているか判定する。

今、図書館に関する情報が含まれているlibraryというエンティティがあり、libraryはhasManyでたくさんのbooksと紐づいているという状況を考えます。 いま、booksが貸出中か否か、というステータスを持っていて、それはisBorrowedメソッドによって確認できるとします。 liblaryのエンティティーに「貸出中の本が1冊でも存在するか」というメソッドを追加したいとき、collectionクラスを用いて、

public function hasBorrowedBook(){
        $library = $this->lazyLoadBooks(); // 紐付くBooksを取得
        if(empty($library->books)) return false;
        return collection($library->books)->some(function($book){
            return $book->isBorrowed();
        });
    }

とすると良いです。

反対に、「全て借りられていない状態か」という記述にしたいときは、

public function hasBorrowedBook(){
        $library = $this->lazyLoadBooks(); // 紐付くBooksを取得
        if(empty($library->books)) return false;
        return collection($library->books)->every(function($book){
            return ! $book->isBorrowed();
        });
    }

とすると良いです。