finder

Posted by muchag | CakePHP 3.x | 2018-01-08 (月) 15:17:49

結果セット取得便利メソッド。

公式:データの取り出しと結果セット データのロードに Finder を使う

【環境】
CakePHP: 3.5.8
php: 7.1.5
書式
/vendor/cakephp/cakephp/src/ORM/Table.php

public function find($type = 'all', $options = [])

第1引数:ファイダタイプ。デフォルトは all
第2引数:オプション

タイプ

ファインダタイプを指定することで、専用ファインダメソッドを呼び出せる。

デフォルト
/vendor/cakephp/cakephp/src/ORM/Table.php

public function findAll(Query $query, array $options)

public function findList(Query $query, array $options)

public function findThreaded(Query $query, array $options)

とあるので
タイプには、上記3種は指定可能だと思う。

連鎖

find メソッドを繋げることも可能。


$children = $categories
    ->find('children', ['for' => 1])
    ->find('threaded')
    ->toArray();

公式:Tree クイックツアー
こちらに記載されている上記コードを実行してみて
ちゃんと目的通りの結果を得られたので
こういう記述が可能であることは理解できた。

が、どういう仕組みになっているのかは、現在不明。

オプション
  • conditions クエリーの WHERE 句に使う条件を提供します。
  • limit 欲しい行数をセットします。
  • offset 欲しいページオフセットをセットします。 page をあわせて使うことで計算を簡単にできます。
  • contain 関連をイーガーロード (eager load) するように定義します。
  • fields エンティティーへとロードされる列を制限します。いくつかの列だけがロードされることになるので エンティティーが正しく動かないこともありえます。
  • group クエリーに GROUP BY 句を加えます。集約関数を使う際に便利です。
  • having クエリーに HAVING 句を加えます。
  • join カスタム JOIN を追加で定義します。
  • order 結果セットに並び順を設定します。
カスタム(自作)

公式:データの取り出しと結果セット カスタム Finder メソッド

書式

use Cake\ORM\Query;
use Cake\ORM\Table;

class ArticlesTable extends Table
{

    public function findOwnedBy(Query $query, array $options)
    {
        $user = $options['user'];
        return $query->where(['author_id' => $user->id]);
    }

}

// コントローラーやテーブルのメソッド内で
$articles = TableRegistry::get('Articles');
$query = $articles->find('ownedBy', ['user' => $userEntity]);
動的

Symfony 2 のときと考え方は同じ~♪


// findBy, findAllBy の後ろにカラム名を付ける
// 引数に、当該カラムに設定したい検索条件を設定する
$query = $this->Users->findByUsername('joebob');

// 複数カラムの場合は、And, Or で繋げる
// 但し、And, Or の混在は NG
$query = $users->findAllByUsernameAndApproved('joebob', 1);
$query = $users->findAllByUsernameOrEmail('joebob', 'joe@example.com');

// カスタムファインダにも利用可能
$query = $users->findTrollsByUsername('bro');
CakePHP 3.x | 2018-01-08 (月) 15:17:49 |

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment