LoginSignup
33
31

More than 5 years have passed since last update.

ZF2を使っていろいろなSELECT文を生成する

Posted at

たまにZF2を使ったりするけど、いつも使い方忘れて調べてる気がするのでメモとして残しておく、ちなみにMysqlを想定

アダプタの生成

$adapter = new \Zend\Db\Adapter\Adapter(array(
            'driver'        => 'Pdo',
            'dsn'           => 'mysql:dbname=DBの名前;host=ホスト名',
            'username'      => 'ユーザ名',
            'password'      => 'パスワード',
            'driver_option' => array(
                \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
            ),
        ));

TableGatewayの生成

 //特に指定しないと結果はarrayobjectになる
 $tableGateway = new \Zend\Db\TableGateway\TableGateway('テーブル名', $adapter);

 //配列にしたい場合はこんな感じ
 $resultSet    = new \Zend\Db\ResultSet\ResultSet(ResultSet::TYPE_ARRAY);
 $tableGateway = new \Zend\Db\TableGateway\TableGateway('テーブル名', $adapter, null, $resultSet);

SELECT

select実行

$tableGateway = new \Zend\Db\TableGateway\TableGateway('user', $adapter);
$select = $tableGateway->getSql()->select();
$res = $tableGateway->selectWith($select);

条件指定


$select->where->equalTo('col', '値');
//SELECT "user".* FROM "user" WHERE "col" = '値'

$select->where->notEqualTo('col', '値')
//SELECT "user".* FROM "user" WHERE "col" != '値'

$select->where->greaterThan('col', '値');
//SELECT "user".* FROM "user" WHERE "col" > '値'

$select->where->greaterThanOrEqualTo('col', '値');
//SELECT "user".* FROM "user" WHERE "col" >= '値'

$select->where->lessThan('col', '値');
//SELECT "user".* FROM "user" WHERE "col" < '値'

$select->where->lessThanOrEqualTo('col', '値');
//SELECT "user".* FROM "user" WHERE "col" <= '値'

$select->where->in('col', array('値1', '値2'));
//SELECT "user".* FROM "user" WHERE "col" IN ('値1', '値2')

$select->where->isNull('col');
//SELECT "user".* FROM "user" WHERE "col" IS NULL

$select->where->isNotNull('col')
//SELECT "user".* FROM "user" WHERE "col" IS NOT NULL

$select->where->between('col', 'min', 'max');
//SELECT "user".* FROM "user" WHERE "col" BETWEEN 'min' AND 'max'

$select->where->equalTo('col', '値')
              ->or
              ->equalTo('col2', '値2');
//SELECT "user".* FROM "user" WHERE "col" = '値' OR "col2" = '値2'

$select->where->equalTo('col', '値1')
              ->NEST
              ->equalTo('col2', '値2')
              ->or
              ->equalTo('col3', '値3')
              ->UNNEST;
//SELECT "user".* FROM "user" WHERE "col" = '値1' AND ("col2" = '値2' OR "col3" = '値3')

$select->where->like('col', '%値1%');
//SELECT "user".* FROM "user" WHERE "col" LIKE '%値1%'

$select->where->notLike('col', '%値1%');
//SELECT "user".* FROM "user" WHERE "col" NOT LIKE '%値1%'

カラムの指定

 $select->columns(array('col1','col2'));
 //SELECT "user"."col1" AS "col1", "user"."col2" AS "col2" FROM "user"

 $select->quantifier(\Zend\Db\Sql\Select::QUANTIFIER_DISTINCT)
        ->columns(array('col1','col2'));
 //SELECT DISTINCT "user"."col1" AS "col1", "user"."col2" AS "col2" FROM "user"

 $select->columns(array('colcol' => 'col1'));
 //SELECT "user"."col1" AS "colcol" FROM "user"

 $select->columns(array('count' => new \Zend\Db\Sql\Predicate\Expression('COUNT(*)')));
 //SELECT COUNT(*) AS "count" FROM "user"

FROM句にサブクエリ


 $select = $tableGateway->getSql()->select();
 $select2 = new \Zend\Db\Sql\Select();
 $select2->from(array('select' => $select));
 //SELECT "select".* FROM (SELECT "user".* FROM "user") AS "select"

union

$select = $tableGateway->getSql()->select();
$select2 = new \Zend\Db\Sql\Select();
$select2->from('user');
$select2->combine($select);
//( SELECT "user".* FROM "user" ) UNION ( SELECT "user".* FROM "user" )

join

$select->join('table', 'user.id = table.id', array('col'));
//SELECT "user".*, "table"."col" AS "col" FROM "user" INNER JOIN "table" ON "user"."id" = "table"."id"

$select->join('table', 'user.id = table.id', array('col'), $select::JOIN_LEFT);
//SELECT "user".*, "table"."col" AS "col" FROM "user" LEFT JOIN "table" ON "user"."id" = "table"."id"

33
31
0

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
33
31