LoginSignup
38
32

More than 5 years have passed since last update.

Phalconのクエリビルダ(Phalcon\Mvc\Model\Criteria)備忘録

Last updated at Posted at 2015-08-26

はじめに

検索にCriteriaとfindやfindFirstの2種類がありますが、ここしばらくPhalconを使い続けてきて、ようやくCriteriaをメインに使っていこうと思い至りました。
理由はコードを見たときに分かりやすい方がCriteriaだったから。
で、使い方をすぐに忘れるので、よく使うものを備忘録として残しておきます。
公式も参照してみてください。

基本

Model::query()で取得できるCriteriaオブジェクトにどんどん追加していきます。

1つずつ追加していく
$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])

whereの最初のみ使える
$criteria->where('id=:id:', ['id' => $id]);
AND条件を追加したい時(最初に使ってもOK)
$criteria->andWhere('id=:id:', ['id' => $id]);
OR条件を追加したい時(最初に使ってもOK)
$criteria->orWhere('id=:id:', ['id' => $id]);
[非推奨]whereを追加
$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)

BETWEEN
$criteria->betweenWhere('price', 100.25, 200.50);
NOT_BETWEEN
$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])

種別を指定するJOIN(省略時はINNER)
$criteria->join('Robots', 'r.id = RobotsParts.robots_id', 'r', 'LEFT');
INNER_JOIN
$criteria->innerJoin('Robots', 'r.id = RobotsParts.robots_id', 'r');
LEFT_JOIN
$criteria->leftJoin('Robots', 'r.id = RobotsParts.robots_id', 'r');
RIGHT_JOIN
$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();
38
32
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
32