LaravelでMySQLではなくSQL Server(RDS)を採用する際の注意点とシステム構築のポイント

1. はじめに

LaravelでWebアプリケーションを開発する際、データベースの第一選択肢としてMySQLやPostgreSQLが選ばれることが多いかと思います。しかし、エンタープライズ向けのシステム開発や、既存の社内資産(Microsoftエコシステム)との統合、あるいはクライアントの指定などにより、SQL Server(Microsoft SQL Server)を採用しなければならない局面があります。

クエリビルダやEloquent(ORM)によってデータベースの違いはある程度抽象化されますが、設計や運用のフェーズでは、SQL Server特有の仕様や挙動の違いについて事前に把握しておく必要があります。

この記事では、実際にLaravel × SQL Serverの構成でシステムを構築した際の経験をもとに、実装時における具体的な注意点と、AWSのRDSで稼働させる際のインフラ視点での考慮すべきポイントをまとめました。


2. Laravel実装・仕様における注意点(MySQLとの違い)

まずは、Laravelのアプリケーションコードやデータベース設計(マイグレーション)を行う上で、MySQLとの違いに留意すべきポイントを解説します。

① ドライバーの導入
Laravelのコンテナやローカル開発環境(Dockerなど)を立ち上げただけでは、SQL Serverには接続できません。PHPからSQL Serverに接続するためには、拡張機能である「Microsoft Drivers for PHP for SQL Server(pdo_sqlsrv)」と、OS側に「Microsoft ODBC Driver」を個別にインストールする必要があります。
Dockerfileにこれらのインストール処理を追加するステップが発生するため、初期の環境構築フェーズで考慮しておくべきポイントです。
② 【事例】UUIDのケース(大文字・小文字)による影響

Laravel側で主キーや外部キーとしてUUIDを採用する場合、データベースのデータ型による挙動の違いに注意が必要です。

Laravelの

Str::uuid()

などで発行されるUUIDは、通常アルファベット小文字(例:

a1b2c3d4-...

)です。しかし、これをSQL Serverの

uniqueidentifier

型の列に登録すると、データベース側では自動的にアルファベット大文字(例:

A1B2C3D4-...

)に変換されて格納されます。

PHP
// Laravel側で発行(小文字)
$uuid = (string) Str::uuid();
// "a1b2c3d4-..." User::create(['id' => $uuid, 'name' => 'テストユーザー']);
// SQL Server側には大文字で保存される
// "A1B2C3D4-..."
SQL Serverの照合順序(Collation)がケースインセンシティブ(大文字小文字を区別しない:

_CI

)であれば、SQLの検索(

WHERE

句など)自体は問題なく一致します。

しかし、「取得したデータをアプリケーション(PHP)側で厳密に文字列比較する」「JavaScript(フロントエンド)にそのまま渡して、フロント側で厳密な比較(

===

)を行う」といった処理を含んでいる場合、大文字と小文字の差異によって不一致と判定されてしまうケースがあります。

【対応策】
SQL Serverから取得したUUIDをプログラム側で扱う際は、常に

strtolower()

Str::lower()

で小文字に統一するか、型を

uniqueidentifier

ではなく

varchar(36)

にして文字列として小文字のまま保存するなどの設計上の工夫が有効です。

③ マイグレーションの挙動差
Laravelのマイグレーションファイルで

$table->string('name')

と定義した場合、MySQLでは

varchar

型になりますが、SQL Serverでは

nvarchar

型(Unicode文字列)として作成されます。

nvarchar

は日本語などのマルチバイト文字を考慮する上で安全ですが、1文字あたりに必要なバイト数が異なるため、インデックスの最大サイズ上限に影響を与える場合があります。また、外部キー制約の命名規則や長さの上限もMySQLとは異なるため、既存のマイグレーションファイルを流用する際は事前の検証が推奨されます。

④ 生SQL(MySQL固有関数)の互換性
クエリビルダを基本とする場合でも、複雑なクエリで

whereRaw()

selectRaw()

を使い、生SQLを書くことがあります。この際、MySQL特有の関数を使っていないか確認が必要です。

    • 日付の取得: MySQLの
      NOW()

      は、SQL Server(T-SQL)では

      GETDATE()

    • 文字列結合: MySQLの
      GROUP_CONCAT()

      は、SQL Serverでは

      STRING_AGG()

    • ページネーション:
      LIMIT / OFFSET

      の記述(SQL Serverのバージョンや構文によっては

      OFFSET FETCH

      を使用)

これらはクエリビルダの自動吸収の対象外となるため、SQL Serverの構文に合わせて記述する必要があります。

3. AWS RDS(SQL Server)で稼働させるときの注意点

インフラをAWS上に構築し、マネージドデータベースであるAmazon RDSでSQL Serverを運用する場合、オープンソースのMySQLとは異なる運用・コスト面の特性を考慮する必要があります。
① 【事例】クエリのメモリ見積もりと処理の待ち時間(ウェイト)への対策
運用フェーズにおけるリソース管理において、SQL Server特有のメモリ管理アルゴリズムに留意する必要があります。
SQL Serverのオプティマイザは、クエリを実行する際、事前に必要となる使用メモリ量を多めに見積もる(Memory Grant)性質があります。
これにより、以下のような挙動が発生することがあります。
  • データ量が少なく軽量なクエリであっても、一時的なソートや結合(Join)が含まれていると、システムが「この処理には一定以上のメモリが必要である」と推測してメモリを要求する。
  • 同時に複数のリクエストが集中すると、データベース全体の空きメモリが一時的に不足し、処理が実行されずにメモリ確保の順番待ち(RESOURCE_SEMAPHOREウェイト)が発生する。
  • 結果として、データ量が少ないにもかかわらず、レスポンスに大幅な待ち時間(遅延)が生じてしまう。
【対応策】
MySQLなどの感覚で「データ量が少ないうちは最小限のスペック(db.t4g.microなど)で対応できる」と判断すると、思わぬボトルネックになることがあります。この挙動に対応するためには、インデックスを徹底的に最適化してメモリ要求量を抑えることはもちろん、「メモリ割り当てに余裕を持たせる(RDSのインスタンスクラスをはじめから高めに選定する)」というインフラ側からのアプローチが効果的です。
② ライセンス費用によるコスト面の影響
MySQLやPostgreSQLはオープンソースですが、SQL Serverは商用データベースであるため、RDSの利用料金にMicrosoftのライセンス費用が内包されます。
同じスペック(vCPUやメモリ量)のインスタンスを選択しても、MySQLと比べるとランニングコストが高くなる傾向があります。さらに、マルチAZ(冗長化)構成にする場合、選択するエディション(Standard Editionなど)によってライセンス要件が変わるため、事前のコストシミュレーションが不可欠です。
③ Amazon Auroraの選択肢について
AWSの強力なフルマネージドDBである「Amazon Aurora」は、現在のところMySQL互換とPostgreSQL互換のみの提供となっています。
そのため、SQL Serverを採用する場合はAurora独自の柔軟なオートスケーリングや高速なレプリケーションの仕組みを直接利用することはできません。通常のAmazon RDS(マルチAZ構成時は、SQL ServerのAlways On可用性グループなどの仕組みを用いた同期)として、堅実な運用設計を行う必要があります。
④ タイムゾーンの固定仕様
RDSでSQL Serverのインスタンスを作成する際、オプショングループ等を利用してタイムゾーン(例:

Tokyo Standard Time

)を設定することができます。

しかし、このタイムゾーン設定はインスタンス作成時に一度決定すると、後から変更することができません。「デフォルトのUTCのまま立ち上げてしまい、後から日本時間に変更したくなった」という場合は、データベースのSnapshotから新しいインスタンスを再作成・移行する大掛かりな作業が必要になるため、最初の構築時に確実に設定しておく必要があります。

4. まとめ

Laravelという優れたフレームワークのおかげで、データベースの違いは高度に抽象化され、共通のコード資産で開発を進めることができます。しかし、詳細な仕様に踏み込むと、今回紹介した「UUIDの大文字化に伴うアプリケーション側での比較への影響」「SQL Server特有のメモリ見積もり仕様によるレスポンスへの影響」のように、RDBMS固有の挙動への理解が求められます。
Web上のLaravelに関する情報の多くはMySQLやPostgreSQLを前提に書かれていることが多いため、SQL Serverを組み合わせる際は、これらの特性をチーム全体で事前に共有しておくことが大切です。
初期段階から十分なメモリスペックの確保と、実際のデータ挙動を意識した厳密な検証環境でのテストを行うことで、安定したシステム構築が可能となります。

LaravelでExcel出力をする方法

LaravelでExcelをインポート・エクスポートしたい

LaravelでExcelやCSVのインポート・エクスポート機能を実装したい場合に便利なのがLaravel Excelです。
composer経由でインストールすることができます。
実際にLaravelExcelをインストールしてExcelファイルを書き出すところまでの手順を簡単に解説します。
※usersテーブルのデータを出力する処理を実装するため、前提としてusersクラスにユーザーの追加をお願いします。

インストール

Composer経由でインストールします。

composer require maatwebsite/excel

インストール後に下記コマンドを実行してmakeの欄に「make:export」と表示されていればインストール完了です。

php artisan list

Exportクラスを作成する

LaravelExcelでは出力内容をExportクラスに定義します。
そのためまずはExportクラスを作成します。

php artisan make:export UsersExport --model=User

すると「app/Exports/UsersExport.php」が作成されます。

collection()がExcelへ出力するデータを返すメソッドです。
今回は「User::all()」を返しているため、usersテーブルの内容がそのままExcelになるはずです。

ルーティング作成

web.phpにルーティングを作成します。
下記コードをそのまま貼り付けて使用できます。

use App\Exports\UsersExport;
use Maatwebsite\Excel\Facades\Excel;

Route::get('/users/export', function () {
    return Excel::download(new UsersExport(), 'users.xlsx');
});

実際にサーバーを起動して出力

追加したルーティングにアクセスしてダウンロードしてみましょう。

http://localhost:8000/users/export

すると「users.xlsx」がダウンロードされます。
usersテーブルにデータがあれば、Excelファイル内に一覧が出力されます。

まとめ

Laravel12でLaravel Excelを使う流れは以下の通りです。

1. パッケージをインストール
2. Exportクラスを作成
3. collection()で出力データ定義
4. Excel::download()でダウンロード

基本はこれだけです。
他にも様々な機能が用意されているので、公式ドキュメントを読んで色々試してみるのも面白いです。
Laravel Excel公式ドキュメント

Laravel 12で追加された一部新機能について

Laravel 12の新機能について

この記事では、2025年2月にリリースされた Laravel 12 の一部新機能について紹介します。

Laravel 12

Laravel 12は、大きな変更というよりも改良がいくつか含まれているので、今回はその中の一部を紹介します。

1. セキュリティ強化 : secureValidate()

このメソッドが追加されたことで、フォームからの入力チェックがより安全になりました。

$request->secureValidate([
'password' => ['required', 'min:8', 'strong'],
]);

バリデーション(validation)とは、ユーザーが入力したデータが正しいかどうかをチェックする仕組みです。

例えば

  • メールアドレスの形式が正しいか?
  • パスワードの長さは十分か?
  • 必須項目が空になっていないか?
    など。

Laravelでは、従来から $request->validate() を使ってこのバリデーションを行ってきました。

secureValidate() とは?

secureValidate() は、Laravel 12で新たに追加されたメソッドで、従来の validate() と同じように使えますが、セキュリティに配慮したルール(例:強力なパスワード)を簡単に適用できるのが特徴です。

$request->secureValidate([
'password' => ['required', 'min:8', 'strong'],
]);

この例の意味

 

strongルールの意味とは?

strong というルールは、安全なパスワードを推奨するための組み込みルールで、Laravel 12において以下のようなチェックを行うことができます。

  • 英大文字、小文字、数字、記号の組み合わせが含まれているか
  • 辞書にあるような簡単な単語を避けているか
  • 繰り返しや連番(”1234″ や “aaaa”)が含まれていないかこうしたチェックを自前で書くのは大変ですが、strongルールを使えば一発で適用できます。

なぜ secureValidate() を使うべきか?

  • セキュリティ対策が標準で強化される
  • 独自のカスタムバリデーションを定義しなくてよくなる
  • コードがシンプルで読みやすい

2. クエリがもっと読みやすくなる nestedWhere() が追加された

nestedWhere() は複雑な条件のクエリをより直感的・読みやすく記述できるようにするための新機能です。

そもそも WHERE 条件って何?

Laravelのクエリビルダでは、where() を使って条件付きのデータを取得できます。

$users = User::where('status', 'active')->get();

条件が複雑になってくるとwhere 条件のネストが必要になり、関数の中に関数が入るためとても難解です。

$users = User::where(function ($query) {
$query->where('age', '>', 25)
->orWhere('city', 'Tokyo');
})
->where('status', 'active')
->get();

nestedWhere() の登場

Laravel 12では、このネストを簡単に書けるようにする nestedWhere() が追加されました。

$users = User::where('status', 'active')
->nestedWhere('age', '>', 25, 'or', 'city', 'Tokyo')
->get();

普通のSQLに変換するとこうなります。

WHERE status = 'active'
AND (age > 25 OR city = 'Tokyo')

nestedWhere() の構文

->nestedWhere($column1, $operator1, $value1, $boolean, $column2, $value2)

使いどころ

  • AND (…) や OR (…) などの複雑な論理条件を含むクエリを書くとき
  • ネストの書き方が苦手な初心者
  • チーム開発で読みやすいコードを書きたいとき

まとめ

Laravelは初心者にもやさしく使いやすい機能が満載なので、これからWebアプリを始めるならおすすめです。

初心者にも分かりやすいPHP言語のフレームワークとなっているので、まずは気軽に触ってみて、その便利さを体感してみてください!

Laravelの不具合をサクッと解決!

Laravelを使っていると、開発中にエラーや不具合にぶつかることがあります。ここでは、よくある問題とその解決方法をわかりやすく紹介します。

1. Class “App\Http\Controllers\XxxController” not found

原因

コントローラーが見つからないときは、名前空間のミスやファイルの配置ミスが原因のことが多いです。

解決策

  • app/Http/Controllers/ にファイルがあるか確認。
  • namespace App\Http\Controllers; を追加。
  • composer dump-autoload を実行。
composer dump-autoload

2. .env の変更が反映されない

原因

.env を編集しても変更が反映されないのは、キャッシュが影響している可能性が高いです。

解決策

  • キャッシュをクリアする。
php artisan config:clear
php artisan cache:clear
  • サーバーを再起動する。
php artisan serve --port=8000

3. マイグレーションエラー (`SQLSTATE[HY000] [1045] Access denied for user`)

原因

データベースの接続情報が間違っている可能性あり。

解決策

  1.  .env  の DB_HOST ,  DB_DATABASE ,  DB_USERNAME ,  DB_PASSWORD  を確認。
  2. 変更後、以下のコマンドで設定を反映。
    1. php artisan config:clear
      php artisan migrate
  3. mysql -u ユーザー名 -p  で手動ログインし、アクセス権限をチェック。
     

4. 419 Page Expired エラー

原因

CSRFトークンが送信されていないか、セッションが切れている可能性。

解決策

  • フォームに  @csrf  を追加。
<form action="/submit" method="POST">
    @csrf
    <input type="text" name="name">
    <button type="submit">送信</button>
</form>
  • セッションをクリア。
php artisan session:clear
  •  config/session.php  の  SESSION_DRIVER  を  file  に設定。

5. Route [xxxx] not defined.

原因

指定したルートが定義されていない可能性あり。

解決策

  •  routes/web.php  や  routes/api.php  を確認。
  • ルートを適切に記述。
Route::get('/dashboard', [DashboardController::class,'index'])->name('dashboard');
  • ルートのキャッシュをクリア。
php artisan route:clear

まとめ

Laravelでよくあるエラーとその解決策を紹介しました。エラーが発生したら、

  1. .env 設定やキャッシュを確認
  2. コマンドを実行して設定を更新
  3. 公式ドキュメントもチェック

この流れで対応すれば、大体の問題は解決できます!

LaravelのPipelineについて

今回はLaravelのPipelineについて調べてみました。
Laravelの公式ドキュメントには以下のように記されています。

LaravelのPipelineファサードは、一連の呼び出し可能なクラス、クロージャ、またはcallableを通して与えられた入力を
「パイプ」する便利な方法を提供し、各クラスに入力を検査または修正する機会を与え、パイプライン内の次のcallableを呼び出します

簡単にざっくり説明すると「Pipelineに何らかのデータを入れてそれに対して指定したクラスの処理をさせるもの」です。

基本となるPipelineのコードは以下の通りです。

Pipeline::send(/* 処理させたいクラスに渡すデータ */)
    ->through(/* 処理させたいクラスの配列 */)
    ->then(/* 最終処理 */);

処理させたいクラスに渡すデータ
処理させたい対象のデータです。
文字列やQuery、オブジェクトなどなんでも渡せます。

処理させたいクラスの配列
sendメソッドで渡されたデータを処理させたいクラスを以下のように配列形式で指定します。

Pipeline::send(/* 処理させたいクラスに渡すデータ */)
    ->through([
        ClassA::class,
        ClassB::class,
        ClassC::class,
    ])
    ->then(/* 最終処理 */);

ClassA → ClassB → ClassCの順番で処理が実行されます。

最終処理
thenメソッドに実装された処理は必ず実行される処理です。
実行されるタイミングはthroughメソッドの処理が完了した後です。

実装例

class Pipeline
{
    public function handle()
    {
        $string = "abcde";
        $string = Pipeline::send($string)
            ->through([
                SubStr::class,
                AddString::class,
            ])
            ->thenReturn();
        var_dump($string);
    }
}
class SubStr
{
    public function handle($string, $next)
    {
        $string = substr($string, 1, 4);
        return $next($string);
    }
}
class AddString
{
    public function handle($string, $next)
    {
        $string = $string . "123";
        return $next($string);
    }
}

このような実装をすると先にSubStrクラスで2文字目〜4文字のみ取得され、”bcde”が$stringにセットされます。
次にAddStringクラスで”bcde”の後ろに”123″が文字列結合され最終的に「bcde123」が返されます。

以上、Pipelineが何か気になり調べた結果をまとめてみました。

【Laravel 11について】

今回は、2024年3月12日にリリースされた、Laravelのバージョン11について軽くまとめていきたいとおもいます。
公式サイト:https://readouble.com/laravel/11.x/ja/

目次
――――――――――――――――――――――――――――
① 変更点は?
② まとめ
――――――――――――――――――――――――――――

①変更点は?
・まず、welcomeページが大きく変わりました!!
※黒と赤がベースとなり、カッコ良くなっています。

【旧】

【新】

・ディレクトリ構造の変化
Laravel 11では、開発効率を高めるためにディレクトリ構造が一新されました。この変更により、プロジェクトファイルの構成がシンプルになり、以前のLaravelバージョンに含まれていた定型的なコードが削減されました。

【旧】
app
┣ Console
┣ Exceptions
┣ Http
┣ Models
┗ Providers
bootstrap
┣app.php
┗cache
artisan

【新】
app
┣ Http
┣ Models
┗ Providers
bootstrap
┣app.php
┗cache
artisan

②まとめ
・このようにLaravel 11では開発者の生産性やアプリケーションのパフォーマンスを引き上げるいくつもの革新的な機能が導入されており、カスタムが自由にやりやすくなっております。まだリリースされたばっかりなのでこらから修正も沢山はいるかと思いますが、皆さんも使ってみてはいかがでしょうか?
以上、Laravel 11についてでした。

PHPにおけるシングルトンについて

はじめに

PHPのコードを色々触っている時に、シングルトンなるものに出会ったのでまとめます!

今回のシングルトンというものは、デザインパターンの一つです。
そのために、まずはデザインパターンについて、軽く紹介させていただきます!

デザインパターンとは

過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積し、名前をつけ、再利用しやすいように特定の規約に従ってカタログ化したものである。引用元(Wikipedia)

プログラミングには、この場合はこの書き方が正解。というようなものがいくつかあります。そう言ったものをデザインパターンと呼びます。
その中の一つがシングルトンパターンです。

シングルトンパターンとは

とあるクラスのインスタンスを2つ以上作成できないようにし、どのクラスからアクセスしても同じインスタンスを参照されることを保証します。

1つしか作成できないように強制するような機能というような感じです。

設計者が「1箇所以外から呼び出したくない!」と考えていても、別の箇所から呼び出し可能であれば、設計者の意図をくみ取れないビギナーズが遠慮なく複数生成することがありますよね?(私がその中の1人です…汗)

この複数生成を防ぐためにあるのが、シングルトンです。

通常であれば、複数のインスタンスを作成することができるが、インスタンス作成を1つのみにしたい場合に使用します。

Q:いくつもインスタンスを作成したくない場合ってどんな状況?

設定管理

アプリケーションの設定情報を保持するクラスは、通常は一つのインスタンスだけで十分です。
設定情報はアプリケーション全体で共有されるため、複数のインスタンスを持つと各データの一貫性が失われる可能性があります。

データベース接続

データベース接続は、リソースを多く消費して、複数の接続を開くとパフォーマンスが低下する可能性があります。
シングルトンを使うことで、アプリケーション全体で一つのデータベース接続を共有し、リソースの使用を効率化できます。

ロギング

ログを記録するクラスは、アプリケーション全体で一つだけあれば充分です。
シングルトンを使用すると、ログの記録に一貫性が保たれ、パフォーマンスの問題を避けることができます。

ハードウェアインターフェースの管理

ハードウェアリソース(プリンターなど)へのアクセスを管理する場合、シングルトンは一つのインスタンスを通じてリソースを共有し、競合することを防ぎます。

キャッシュ

データキャッシュやオブジェクトキャッシュのようなリソースは、アプリケーション内で一貫性と効率を保つために、通常は単一のインスタンスで管理されます。

複数のインスタンスが存在すると、データの整合性の問題や無駄なリソースの使用、パフォーマンスの低下などさまざまな問題が発生します。
シングルトンは、これらの問題を解決する効果的な方法です。
ですが、使用する際にはその影響範囲と制約を理解して適切に利用できるよう意識することが大事です。

【Laravelでcronを実装してみた!】

今回は、特定の処理を決まった時間に定期的に実行したいと思い。
Laravelのcron機能を実装してみたので、その備忘録も兼ねて、まとめていきたいと思います。
(Laravelのscheduleクラスを利用しております。)
https://readouble.com/laravel/10.x/ja/scheduling.html
※今回のLaravel バージョンは10です。

目次
――――――――――――――――――――――――――――
① 「cron」とは
② 基礎
③ 発展
④ まとめ
――――――――――――――――――――――――――――

①『cron』とは
cronとは、「定期的にタスクを自動実行するための機能」です。
「クーロン」と読みます。cronを利用すると時間を指定して、あらかじめ決まった時間にタスクを実行してくれます。

以下、「cron」の使用例です。
例)毎分ごとに特定のディレクトリを参照し、ファイルを読み込みたい。
例)日付が変わるタイミングで特定の処理をしたい。
例)毎月初めにステータスをリセットしたい。

②基礎
[1]まずは実行するプログラムを作成します。
・Laravelのコマンドでファイルを作成します。
php artisan make:command SendEmails

上記のコマンドにより、Commandsディレクトリにファイルが作成されます。
project
├─ app
│ ├─ Console
│ │ ├─ Commands
│ │ │ └─ SeendEmails
│ │ ├─ Kernel.php

[2]つぎにファイルを追記していきます。
・「$signature」変数にコマンド名を格納します。
例)protected $signature = ‘command:sendEmails’;

・「$description」変数に処理の内容を格納します。
例)protected $description = ‘メールを配信する。’;

・「handle()」メソッド内に処理を記載します。
例)public function handle() {

{
ここにしたい事を書く。
※今回は割愛します。
}

以上の手順にて、実行するプログラム(コマンド)を作成することができます。

③発展
基礎にてコマンドを作成したので、発展では定期的に実行できるようにタスクスケジュールをしていきましょう。

[1] Kernelファイルにスケジュールを記載する。
・ConsoleフォルダにあるKernel.phpファイルに追記します。
project
├─ app
│ ├─ Console
│ ├─ Commands
│ │ └─ SeendEmails
│ ├─ Kernel.php

・Kernal.phpの$commandsに追記する。
例)protected $commands = [
\App\Console\Commands\SendEmails::class,
];

・Kernal.phpのschedule()メソッドにてスケジュールを指定できる。
例)protected function schedule(Schedule $schedule)
{
$schedule->command(‘command:sendEmails’)->everyTenMinutes();
}

以上の設定にて、10分ごとにsendEmailsコマンドを実行するように設定することができます。

[2] スケジュールの種類

メソッド 説明
cron('* * * * *');
カスタムcronスケジュールでタスクを実行
everySecond();
毎秒タスク実行
everyTwoSeconds();
2秒毎にタスク実行
everyFiveSeconds();
5秒毎にタスク実行
everyTenSeconds();
10秒ごとにタスク実行
everyFifteenSeconds();
15秒毎にタスク実行
everyTwentySeconds();
20秒ごとにタスク実行
everyThirtySeconds();
30秒ごとにタスク実行
everyMinute();
毎分タスク実行
everyTwoMinutes();
2分毎にタスク実行
everyThreeMinutes();
3分毎にタスク実行
everyFourMinutes();
4分毎にタスク実行
everyFiveMinutes();
5分毎にタスク実行
everyTenMinutes();
10分毎にタスク実行
everyFifteenMinutes();
15分毎にタスク実行
everyThirtyMinutes();
30分毎にタスク実行
hourly();
毎時タスク実行
hourlyAt(17);
1時間ごと、毎時17分にタスク実行
everyOddHour($minutes = 0);
奇数時間ごとにタスク実行
everyTwoHours($minutes = 0);
2時間毎にタスク実行
everyThreeHours($minutes = 0);
3時間毎にタスク実行
everyFourHours($minutes = 0);
4時間毎にタスク実行
everySixHours($minutes = 0);
6時間毎にタスク実行
daily();
毎日深夜12時に実行
dailyAt('13:00');
毎日13:00に実行
twiceDaily(1, 13);
毎日1:00と13:00に実行
twiceDailyAt(1, 13, 15);
毎日1:15と13:15に実行
weekly();
毎週日曜日の00:00にタスク実行
weeklyOn(1, '8:00');
毎週月曜日の8:00に実行
monthly();
毎月1日の00:00にタスク実行
monthlyOn(4, '15:00');
毎月4日の15:00に実行
twiceMonthly(1, 16, '13:00');
毎月1日と16日の13:00にタスク実行
lastDayOfMonth('15:00');
毎月最終日の15:00に実行
quarterly();
四半期の初日の00:00にタスク実行
quarterlyOn(4, '14:00');
四半期の4日の14:00に実行
yearly();
毎年1月1日の00:00にタスク実行
yearlyOn(6, 1, '17:00');
毎年6月1日の17:00にタスク実行
timezone('America/New_York');
タスクのタイムゾーンを設定

④まとめ
このようにLaravelでは、スケジュール機能にてcron機能を実装することができます。
とても便利な機能なので、ぜひ使用してみてはいかがでしょうか。

【Laravelの機能についてまとめてみよう】~~~Model編~~~

今回は、【Laravelの機能についてまとめてみよう】第二弾です。
第二弾は….. 『Model』についてです!!

※Laravel バージョンは8をベースにしております。

目次

――――――――――――――――――――――――――――
① Modelとは
② 作成方法
③ 使用方法
④ まとめ
――――――――――――――――――――――――――――

① Model とは

Model(モデル)はデータベースとデータをやりとりするために作成します。
モデルを使うことで、LaravelのORMであるEloquentの機能を使って、データの取得や追加・更新などを行うことができます。

以下のサイトも参考にしてみてください。
↓↓※公式リファレンスを日本語訳しているサイト↓↓
https://readouble.com/laravel/8.x/ja/eloquent.html

② 作成方法

最初にModelクラスの作成からはじめましょう。

直接ファイルを作成することも出来ますが、今回はLaravelの機能『artisan』コマンドを使用して作成していきます。

project
├─ app
│ ┗Models
│   ┗Test.php (※ここにファイルが生成される)
├─ 略(config database public 等)

作成されたファイルを確認します。

【Test.php】

&amp;lt; ?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Test extends Model
{
use HasFactory;
}

※Artisanコンソールについての詳細は以下のサイトをご覧ください。
https://readouble.com/laravel/8.x/ja/artisan.html

③ 使用方法

次に、Laravel(Model)とDBの紐づけを行っていきましょう。

[1] Modelクラスの命名規則
・Modelクラスの名前は紐づけたいテーブルに対して単数形でかくように決められています。

今回はテーブル名がtestsを使用するので、Modelの名前をtestとします。
例)テーブル名が『users』の場合。→Modelは『user』となる。

・決められたModel名以外のテーブルを使用したい場合。
$tableプロパティを作成し、そこで定義する。
例)『samples』テーブルと紐づけたい場合

protected $table ='samples'

[2] データの登録設定
・Laravelでデータを追加するためにcreateメソッドを使用しますが、使うためにはfillableかguardedの設定が必要です。
例)登録可能にしたいカラムを全て記載します。指定されたカラム以外は登録できないようになります。

protected $fillable = [
'name',
'password',
'email',
'tell'
];

④ まとめ
このようにルールに従い、Modelを作成することでEloquentを利用してテーブルを操作することが可能です。

以上、簡単にではありますが大まかなModelについてまとめてきました。
Modelを深堀りするとまだまだまとめきれてないことが多いので
次の機会にもっと深く紹介できればと思います!

【Laravelとトロッコを連携させてデータをExcelに出力する方法】

今回は、【Laravelにてトロッコを使用したデータの出力】について実装していきましょう。

※Laravel バージョンは9をベースにしております。

目次

――――――――――――――――――――――――――――

①前提

②実装

③発展

――――――――――――――――――――――――――――

①前提に

トロッコとは?・・・trocco®は、ETL/データ転送・データマート生成・ジョブ管理・データガバナンスなどの
データエンジニアリング領域をカバーした、分析基盤構築・運用の支援SaaSです。

・「/trocco」のアクセスにて処理の実行していきます。
 ※シンプルに実装したいため、今回はControllerなどは使わずにRouteの中で実装します。

・トロッコにcsvでデータを渡し、そこからExcelにデータを渡し出力していきます。

・文字コードは「UTF-8」を使用します。※Laravelではcsvの出力はデフォルトで「UTF-8」になってます。

②実装

では、実際に処理を見ていきましょう。

Route::get('/trocco', function () {
$callback = function() {
$csv = fopen('php://output', 'w');
$users = User::get(['id','name','email']);
foreach ($users as $user) {
fputcsv($csv, [
$user-&gt;id,
$user-&gt;name,
$user-&gt;email,
]);
}
fclose($csv);
};
return response()-&gt;stream($callback, 200, [
'Content-Type' =&gt; 'text/csv',
]);
});
Route::get(‘/trocco’, function () {
┗https://○○/troccoにアクセスがあった時の処理を記載します。

$callbackの中でcsvファイルを作成していきます。
$csv = fopen(‘php://output’, ‘w’);
┗ファイルを開きます。

$users = User::get([‘id’,’name’,’email’]);
┗Modelを使用し、userテーブルのidと名前、メールアドレスを取得します。

foreach ($users as $user) {
┗件数分繰り返し処理を行います。

fputcsv($csv, [$user->id,$user->name,$user->email,]);
┗開いたファイルに第二引数の配列を書き込みます。

fclose($csv);
┗ファイルを閉じてcsvファイルの完成です。

最後にreturn response()->stream($callback, 200, [‘Content-Type’ => ‘text/csv’,]);  にてcsvのファイルを『$callback』にて作成し返します。

③発展

このまま実装したままだと、誰でもアクセスされるとユーザー情報が取れてしまいます。

セキュリティ的に問題が大ありなので、アクセスにIP制限をかけたいとおもいます。

IP制限の実装は簡単で、【Route::get(‘/trocco’, function () {】の中の一番上に以下の処理の追加で制限をかけることができます。

// IPアドレス許可リスト


$white_list = [

'○○.○○○.○○.○○○',
'○○.○○○.○○.○○○',
'○○.○○○.○○.○○○',

];

if (config('app.env') != 'local' &amp;&amp; ! in_array(request()-&gt;ip(), $white_list)) {
abort(403);
}

 

以上でLaravelにてトロッコを使用したデータの出力機能の完成です!!
いつの日か、トロッコについてもまとめてみようと思います。