はじめに
本記事ではストアドプロシージャやファンクションをLaravelで呼び出す方法を紹介しています。
なお、今回は呼び出しに関する記事のため、シンプルなSQLで構成されています。
よりストアドの強みを生かした記述の多いパターンはこちらの記事を参考にしてください。
👉https://qiita.com/aymn_che/items/401f4a30595171c9c1a7
対象読者
- PostgreSQLを使っているLaravelエンジニア
- ストアドプロシージャやファンクションの記述を知りたい方
- DBの処理をまとめて再利用したい方
ゴール
- PostgreSQLのストアドファンクションを作成できる
- Laravelからその関数を呼び出せる
- マイグレーションでストアドプログラムを管理できる
1. PostgreSQLで関数を作成する
CREATE OR REPLACE FUNCTION get_user_by_id(user_id INT)
RETURNS TABLE (id INT, name TEXT, email TEXT)
AS $$
BEGIN
RETURN QUERY
SELECT id, name, email
FROM users
WHERE id = user_id;
END;
$$ LANGUAGE plpgsql;
ポイント解説
-
CREATE OR REPLACE FUNCTION
- 新しい関数を作成、または既存のものを置き換えます。
-
get_user_by_idが関数名。
-
RETURNS TABLE
- 返り値を「テーブル型」で定義できます。
- 複数カラムを返したいときに便利です。
- 例:
RETURNS TABLE (id INT, name TEXT, email TEXT)
👉 補足:返り値が1つだけなら
RETURNS textやRETURNS booleanのように単一型を使えます。- True/Falseを返す場合 →
RETURNS boolean - 名前だけ返す場合 →
RETURNS text
-
BEGIN...END
- 関数本体の処理を記述します。
-
RETURN QUERY
-
SELECTの結果をそのまま返すときに使用します。 - 単一値を返す場合は
RETURN <変数名>と書けばOKで、RETURN QUERYは不要です。
-
-
LANGUAGE plpgsql
- この関数が PL/pgSQL で書かれていることを指定します。
👉 PostgreSQLでは他にも sql(標準SQL)、plpython3u(Python)、plv8(JavaScript)などを使えます。
2. Laravelから関数を呼び出す
Laravelの DBファサード を使って実行します。
$user = DB::select('SELECT * FROM get_user_by_id(?)', [1]);
- 第一引数に呼び出す関数名(SQL文形式)
- 第二引数にパラメータを渡します
この例では、user_id = 1 のユーザーを取得します。
3. マイグレーションで関数を管理する
Laravelではマイグレーションにストアドプログラムを記述することも可能です。
public function up()
{
DB::unprepared('
CREATE OR REPLACE FUNCTION get_user_by_id(user_id INT)
RETURNS TABLE (id INT, name TEXT, email TEXT)
AS $$
BEGIN
RETURN QUERY
SELECT id, name, email
FROM users
WHERE id = user_id;
END;
$$ LANGUAGE plpgsql;
');
}
public function down()
{
DB::unprepared('DROP FUNCTION IF EXISTS get_user_by_id(INT)');
}
-
DB::unprepared()にSQLを直接書く -
down()で削除処理を書いておくと、rollbackもできて便利です。
まとめ
- PostgreSQLの関数を作ると、再利用可能で効率的にDB処理を行えるようになります。
- Laravelからは
DB::selectを使って簡単に呼び出すことができます。 - マイグレーションに記述すれば、チーム開発でも共有・管理が容易になります。
最後に
記事を読んでくださった方は、是非弊社開発課のXもフォローしてください。
毎日エンジニアに向けた情報発信を行っています。