Criteriaを使用したSelectクエリの作成

Criteriaを使ったSelectクエリの作り方メモ。


とりあえずサンプル用テーブル定義

# config/schema.yml

user:
  _attributes:      { phpName: User }
  id:
  account:          { type: varchar(32) }
  name:             { type: varchar(255) }
  created_at:
  updated_at:
  _uniques:
    unique_account: [account]

data:
  _attributes:      { phpName: Data }
  id:
  user_id:
  content:          { type: longvarchar }
  created_at:
  updated_at:

symfony propel-build-all」して準備完了。


1.プライマリキーから

<?php
$user = UserPeer::retrieveByPk(1);

2.単純なクエリ

<?php
$c = new Criteria();
$c->add(UserPeer::ACCOUNT, 'hoge');

$user = UserPeer::doSelectOne($c);

echo $user->getName();

3.JOINを使ったクエリ

<?php
$c = new Criteria();
$c->addJoin(DataPeer::USER_ID, UserPeer::ID);
$c->add(UserPeer::ID, 1);

$rs = DataPeer::doSelectJoinUser($c); // userテーブルもJOINしてとってくる

foreach($rs as $r){
  echo $r->getContent();
  echo $r->getUser()->getName();
}

4.Whereを使ったクエリ

<?php
$c = new Criteria();

$c->add(UserPeer::ID, 2, Criteria::GREATER_EQUAL);       // >= 2
$c->add(UserPeer::ID, 1, Criteria::GREATER_THAN);        // > 1
$c->add(UserPeer::ID, 9, Criteria::LESS_EQUAL);          // <= 9
$c->add(UserPeer::ID, 9, Criteria::LESS_THAN);           // < 9
$c->add(UserPeer::ID, array(1,3,5), Criteria::IN);       // IN (1,3,5)
$c->add(UserPeer::ID, array(2,4,6), Criteria::NOT_IN);   // NOT IN (2,4,6)
$c->add(UserPeer::ACCOUNT, 'hoge%', Criteria::LIKE);     // LIKE 'hoge%'
$c->add(UserPeer::ACCOUNT, 'fuga', Criteria::NOT_EQUAL); // <> 'fuga'

$data = UserPeer::doSelect($c);

foreach($rs as $r)
{
  echo $r->getName();
}


5.ORとかANDとか

<?php
$c = new Criteria();

$criterion = $c->getNewCriterion(UserPeer::ID, 1);
$criterion->addOr($c->getNewCriterion(UserPeer::ACCOUNT, 'hoge'));
$c->add($criterion);
$c->add(UserPeer::ID, 10, Criteria::LESS_THAN);

$user = UserPeer::doSelect($c);