はじめに
検索にCriteriaとfindやfindFirstの2種類がありますが、ここしばらくPhalconを使い続けてきて、ようやくCriteriaをメインに使っていこうと思い至りました。
理由はコードを見たときに分かりやすい方がCriteriaだったから。
で、使い方をすぐに忘れるので、よく使うものを備忘録として残しておきます。
公式も参照してみてください。
基本
Model::query()で取得できるCriteriaオブジェクトにどんどん追加していきます。
$criteria = Books::query();
$criteria->where('name = :name:', ['name' => '広辞苑']);
$criteria->orderBy('name DESC');
$books = $criteria->execute();
$books = Books::query()
->where('name = :name:', ['name' => '広辞苑'])
->orderBy('name DESC')
->execute();
メソッド
出力カラム
$criteria->columns('id,name,price');
$criteria->columns(['id', 'name', 'price']);
where句
単純な条件
public where (unknown \$conditions, [unknown \$bindParams], [unknown \$bindTypes])
$criteria->where('id=:id:', ['id' => $id]);
$criteria->andWhere('id=:id:', ['id' => $id]);
$criteria->orWhere('id=:id:', ['id' => $id]);
$criteria->addWhere('id=:id:', ['id' => $id]);
LIKE条件
$criteria->where('name LIKE :name:', ['name' => '%' . $name . '%']);
IS NULL条件
$criteria->where('name IS NULL');
IN条件
inWhere (string \$expr, unknown \$values)
$criteria->inWhere('id', [1, 2, 3]);
$criteria->notInWhere('id', [1, 2, 3]);
BETWEEN条件
betweenWhere (string \$expr, unknown \$minimum, unknown \$maximum)
$criteria->betweenWhere('price', 100.25, 200.50);
$criteria->notBetweenWhere('price', 100.25, 200.50);
ORDER BY
orderBy (string \$orderColumns)
$criteria->orderBy('id DESC,price');
$criteria->order('id DESC,price');
GROUP BY
groupBy (string $group)
$criteria->groupBy('id');
LIMIT,OFFSET
limit (unknown \$limit, [unknown \$offset])
$limit = 20;
$offset = 10;
$criteria->limit($limit, $offset);
JOIN
条件を指定しない場合とかの挙動は不明。
join (string \$model, [string \$conditions], [string \$alias], [string \$type])
$criteria->join('Robots', 'r.id = RobotsParts.robots_id', 'r', 'LEFT');
$criteria->innerJoin('Robots', 'r.id = RobotsParts.robots_id', 'r');
$criteria->leftJoin('Robots', 'r.id = RobotsParts.robots_id', 'r');
$criteria->rightJoin('Robots', 'r.id = RobotsParts.robots_id', 'r');
値のバインド
通常はwhere系の第2引数に指定するのであまり使わない。
指定数値が2つのカラムの間に存在するといったような1つの値を2か所で使う際に使う時や、第2引数に入れると見にくくなってしまう時用かな。
$criteria->bind(['id' => 1, 'name' => '広辞苑']);
HAVING
使ったことない。。。
$criteria->having($having);
メソッドで表現できない場合
使ったことない。bind()と共に使うものと思われ。
conditions (unknown $conditions)
$criteria->conditions($condition);
その他・複雑な条件の場合
カッコがついている
これでいいのか分からないがとりあえず
// 開始または終了がnullの場合は無期限
$criteria->where('start<=now() OR start IS NULL');
$criteria->andWhere('now()<end OR end IS NULL');
// (start<=now() OR start IS NULL) AND (now()<end OR end IS NULL)
1件だけ取得したい(findFirst的なやつ)
いい感じのが思いつかないので、とりあえずこれ。
$criteria->where('id=:id:', ['id' => $id])
->limit(1)
->execute()
->getFirst();