3

カスタム ヘッダー (人間が読める形式) を使用して Excel スプレッドシートをインポートし、それらを Excel インポート用のデータベース フィールドと照合しようとしています。

例: 列ヘッダー: 地域 (例: 北米)
データベース 列ヘッダー:region_code

maatwebsite/excelパッケージとEloquentモデルを使用してこれを行う方法はありますか?

4

1 に答える 1

1

これにはいくつかの方法があります。デフォルトでは、maatwerk-excelパッケージはヘッダーをスラッグに変換します。

注: デフォルトでは、これらの属性はスラッグに変換されます。デフォルトは、構成 Excel::import.heading 内で変更できます。利用可能なオプションは次のとおりです: true|false|slugged|ascii|numeric|hashed|trans|original

Excel::import.to_ascii が true に設定されている場合、True と slugged も ASCII に変換されます。デフォルトのセパレーターも構成内で変更できます。

ソース

スラッグで行をアドレス指定できるようになるので、Regionになりregionます。自分に合った設定があるかどうかを確認できます。

ループ、マップ、保存

複雑さは、複数のシートがあるかどうかによって異なります。Mark Ba​​ker が質問のコメントで述べたように、すべてをループしてフィールドごとに 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 自体に実装されたはるかに簡単で迅速な方法があります。その場合、時間を無駄にして申し訳ありません。

于 2016-03-01T23:53:29.377 に答える