Skip to content

Instantly share code, notes, and snippets.

@kaisugi
Last active March 31, 2019 13:02
Show Gist options
  • Save kaisugi/3320a52f07cafc7b505e4b2baa84e580 to your computer and use it in GitHub Desktop.
Save kaisugi/3320a52f07cafc7b505e4b2baa84e580 to your computer and use it in GitHub Desktop.
PHP とか Propel とか Slim とかのメモ

HTTPメソッドの生やし方

たとえば count という POST メソッドなら

$app->post('/count', function(\Slim\Http\Request $request, \Slim\Http\Response $response, $args) use ($app) {
  $params = $request->getParams();
  $data = json_decode($params["data"],true); // この $data がパラメータの連想配列にあたる、多分
  
  /* 処理書く */
  
  // 結果は $output という連想配列に入れて JSON で返す
  
  // $output に結果を入れてから..
  return $response->withJson($output);
});

CSVのダウンロード

ファイルをダウンロードさせる時のHTTPヘッダは Content-Disposition: attachment になる

$app->get('/download_csv', function(\Slim\Http\Request $request, \Slim\Http\Response $response, $args) use ($app) {
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename=example.csv');
    ob_end_flush();
    set_time_limit(0);

    $out = fopen('php://output', 'w');
    stream_filter_register("msLineEnding", "ms_line_ending_filter");
    stream_filter_append($out, "msLineEnding");

    /**
     * 中身
     * fputcsv という配列をCSVに書き込むメソッドをたぶんつかう
     */

    fclose($out);
});

Propel

クエリを伸ばして最終的に->count();で数えたり->find();でデータを得たりする

観察された例

filter 関連

// 以下 sentence カラムに関して

// NULLをはじく
->filterBySentence(null,\Propel\Runtime\ActiveQuery\Criteria::ISNOTNULL)
// 空文字列をはじく
->filterBySentence("",\Propel\Runtime\ActiveQuery\Criteria::NOT_EQUAL);
// $keyword を含む
->filterBySentence("%".$keyword."%",\Propel\Runtime\ActiveQuery\Criteria::LIKE);

ソート関連

// 以下 id カラムに関して

// 昇順
->orderById(\Propel\Runtime\ActiveQuery\Criteria::ASC)
// 降順
->orderById(\Propel\Runtime\ActiveQuery\Criteria::DESC)

結合関連

そもそも JOIN の種類ってなんだっけってなったら https://qiita.com/naoki_mochizuki/items/3fda1ad6594c11d7b43c を見る

例えば HOGE テーブルの fuga_id カラム と FUGA テーブルの id カラムを LEFT_JOIN する場合は

->addJoin(Map\HogeTableMap::COL_FUGA_ID,
  Map\FugaTableMap::COL_ID,
  \Propel\Runtime\ActiveQuery\Criteria::LEFT_JOIN)

結合された FUGA テーブルの name カラムに fuga_name という名前を付けたくなったら

->withColumn(Map\FugaTableMap::COL_NAME, "fugaName")

SELF JOIN する場合は面倒で、(ベストプラクティスなのか分からないが)aliasをつけるとできる

->addAlias("FugaTable", Map\HogeTableMap::TABLE_NAME)
->addJoin(Map\HogeTableMap::COL_PARENT_ID,
    Map\HogeTableMap::alias("FugaTable", Map\HogeTableMap::COL_ID),
    \Propel\Runtime\ActiveQuery\Criteria::LEFT_JOIN)
>withColumn(Map\HogeTableMap::alias("FugaTable", Map\HogeTableMap::COL_NAME), "parentName");

その他SQL一般に関するメモ

LIMIT は取得するデータの限度数、OFFSET はスキップするデータの数を意味する。

例えば

SELECT * FROM tablename ORDER BY columnname LIMIT 5 OFFSET 5;

は columnname でソートしたあと、5件スキップしてその次の5件(すなわち6〜10件)を表示させる。

ページネーションはこのOFFSETを段階的に増やしていくことで実現される。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment