OctoberCMSのバックエンド(管理画面)からデータにファイルや画像をアップロードして添付するのは、フォームの定義だけでロジックの実装なしに実現できる。それに関してはこちら
しかし、プログラムロジックで添付する方法はドキュメントがなかったのでここにメモする。
TL;TR
- 添付ファイルを持つことになる親モデルクラスにリレーションを作成
-
System\Models\File
のインスタンスをnew
で作成 -
fromFile($filePath)
でファイルを読み込む -
save()
でテーブルに保存 - 親モデルクラスのリレーションに
add()
する - 親モデルを
save()
する
Productモデルが複数の画像を添付ファイルとして持つケースを例にして詳細を説明する。
リレーションの作成
複数の添付ファイルの場合$attachMany
に連想配列で定義する。
配列のキーにフィールド名、値にモデルクラスを指定する。添付ファイルなのでSystem\Models\File
にする。(クラス名からは分かりづらいが、このモデルが添付ファイル用のモデルである。)
use Model;
class Product extends Model
{
public $attachMany = ['images' => 'System\Models\File'];
}
注: 2018/10/02現在、まだSystem\Models\File
のバグは修正されていない。添付ファイルをS3などのクラウドストレージに保持する場合にバグが有る。対処方法はこちらで紹介している。
ファイルの添付
use File; // ファサード
use System\Models\File as AttachmentFile; // 添付ファイルのFileクラス
// ネット上のファイルをテンポラリディレクトリにコピー
// (すでにサーバ上にファイルが有る場合は不要)
$tempPath = temp_path(basename($remoteFileUrl));
File::copy($remoteFileUrl, $tempPath);
// DL下ファイルから添付ファイルオブジェクトを作成
$attachFile = new AttachmentFile();
$attachFile->fromFile($tempPath);
// これ自体テーブルを持つモデルクラスなのでテーブルに保存する
$attachFile->save();
// 親データオブジェクトに追加する
// images() はProductモデルで定義したリレーションから作成されたメソッド
$mdlProduct->images()->add($attachFile);
$mdlProduct->save();
// テンポラリファイルを削除する
File::delete($tempPath);
以上!