カスタム ヘッダー (人間が読める形式) を使用して Excel スプレッドシートをインポートし、それらを Excel インポート用のデータベース フィールドと照合しようとしています。
例: 列ヘッダー: 地域 (例: 北米)
データベース 列ヘッダー:region_code
maatwebsite/excel
パッケージとEloquent
モデルを使用してこれを行う方法はありますか?
カスタム ヘッダー (人間が読める形式) を使用して Excel スプレッドシートをインポートし、それらを Excel インポート用のデータベース フィールドと照合しようとしています。
例: 列ヘッダー: 地域 (例: 北米)
データベース 列ヘッダー:region_code
maatwebsite/excel
パッケージとEloquent
モデルを使用してこれを行う方法はありますか?
これにはいくつかの方法があります。デフォルトでは、maatwerk-excel
パッケージはヘッダーをスラッグに変換します。
注: デフォルトでは、これらの属性はスラッグに変換されます。デフォルトは、構成 Excel::import.heading 内で変更できます。利用可能なオプションは次のとおりです: true|false|slugged|ascii|numeric|hashed|trans|original
Excel::import.to_ascii が true に設定されている場合、True と slugged も ASCII に変換されます。デフォルトのセパレーターも構成内で変更できます。
スラッグで行をアドレス指定できるようになるので、Region
になりregion
ます。自分に合った設定があるかどうかを確認できます。
複雑さは、複数のシートがあるかどうかによって異なります。Mark Baker が質問のコメントで述べたように、すべてをループしてフィールドごとに Eloquent モデルに保存できます。ファイルがアップロードされたのか、それともローカル ファイル システムから取得したのかはわかりません。そのため、例としてファイル システム オプションを使用しました。
Excel::load(storage_path('app/public/excel-import.xlsx'), function($reader) {
$results = $reader->get();
foreach($results as $result) {
// Your model namespace here
$model = new \App\ImportItem();
$model->region_code = $result->region;
$model->numeric_code = $result->code;
$model->testfield = $result->test_field;
$model->save();
}
});
多くのフィールドを含む多数の Excel ファイルがある場合、これを維持するのは簡単ではありませんが、それらが少なく、変更される可能性がない場合は、解決策になる可能性があります。
もう 1 つのオプションは、Excel のすべてのヘッダーを変更し (これがオプションである場合)、上記の内容を次のように置き換えてモデルを一括割り当てすることです。foreach
$model = App\ImportItem::create($result->toArray());
ただし、すべての Eloquent モデルはデフォルトで Mass Assignment から保護されていることに注意してください。ドキュメントを調べて、属性を設定するかどうかを確認してくださいfillable
(guarded
前述のセキュリティへの影響に注意してください)。0 => null
インポートするいくつかのファイルのitems
配列にフィールドがあることに気付きましたCellCollection
(明らかに空の列)ので、次のように呼び出すこともできます
$reader->ignoreEmpty()->get()
ただし、他の空のフィールドで望ましくない結果が生じる可能性があるため、別の方法で削除することもできます。
ここで、Excel のすべての列の名前を変更したくない場合は、モデルでミューテーターを定義することもできますが、この状況でもそれは適切ではないと思います。例:
class ImportItem extends Model
{
protected $table = 'importitems';
protected $fillable = [
'region_code',
];
/*
* If you have a field region in the Mass Assignment
* and a field region_code in your database.
*/
public function setRegionAttribute($value)
{
$this->attributes['region_code'] = $value;
}
// Same for each attribute! Ugh what a mess!
たぶん私はこれをすべて無料で書いたのですが、このようなマッピングのためにパッケージや Laravel 自体に実装されたはるかに簡単で迅速な方法があります。その場合、時間を無駄にして申し訳ありません。