0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PostgreSQLのストアドファンクションをLaravelから呼び出す方法

Posted at

はじめに

本記事ではストアドプロシージャやファンクションを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;

ポイント解説

  1. CREATE OR REPLACE FUNCTION

    • 新しい関数を作成、または既存のものを置き換えます。
    • get_user_by_id が関数名。
  2. RETURNS TABLE

    • 返り値を「テーブル型」で定義できます。
    • 複数カラムを返したいときに便利です。
    • 例:RETURNS TABLE (id INT, name TEXT, email TEXT)

    👉 補足:返り値が1つだけなら RETURNS text や RETURNS boolean のように単一型を使えます。

    • True/Falseを返す場合 → RETURNS boolean
    • 名前だけ返す場合 → RETURNS text
  3. BEGIN...END

    • 関数本体の処理を記述します。
  4. RETURN QUERY

    • SELECT の結果をそのまま返すときに使用します。
    • 単一値を返す場合は RETURN <変数名> と書けばOKで、RETURN QUERY は不要です。
  5. 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もフォローしてください。
毎日エンジニアに向けた情報発信を行っています。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?