1

私のアプリケーションには 2 つのテーブルがあります。productsproduct_metas。どちらもOne-To-One Relationship確立しています。

テーブルとテーブルのインポートとエクスポートのソリューションとして、laravel-excelプラグインを使用しています。productsproduct_metas

現在、エクスポート機能は問題なく完全に機能しています。しかし、インポートは私が望むようには機能していません。

インポート用のコントローラー メソッドは次のとおりです。

public function postImportProducts(Request $request) {
    Excel::load( $request->file( 'productsFile' ), function ( $reader ) {    
        $reader->each( function ( $sheet ) {

            if ( $sheet->getTitle() === 'Product-General-Table' ) {

                $sheet->each( function ( $row ) {
                    echo $row->name . '<br />'; // <-- outputs the name correctly.

                    DB::statement( 'SET FOREIGN_KEY_CHECKS=0;' );

                    DB::table( 'products' )->truncate();

                    $product = new Product;
                    $product->name = $row->name;
                    $product->amount = $row->amount;
                    $product->save();

                    DB::statement( 'SET FOREIGN_KEY_CHECKS=1;' );
                });
            }

            if ( $sheet->getTitle() === 'Product-Meta-Table' ) {

                $sheet->each( function ( $row ) {

                    DB::statement( 'SET FOREIGN_KEY_CHECKS=0;' );

                    DB::table( 'product_metas' )->truncate();

                    $productMeta = new ProductMeta;
                    $productMeta->product_id = $row->product_id;
                    $productMeta->description = $row->description;
                    $productMeta->title = $row->title;
                    $productMeta->keywords = $row->keywords;
                    $productMeta->save();

                    DB::statement( 'SET FOREIGN_KEY_CHECKS=1;' );
                });
            }

        });
    });
}

何が間違っているのかわかりませんが、次のようになりますErrorException

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null (SQL: insert into `products` (`name`, `amount`, `updated_at`, `created_at`) values (, , 2015-07-16 09:18:02, 2015-07-16 09:18:02))

編集1:

製品モデル:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    /**
     * Properties that are mass assignable
     *
     * @var array
     */
    protected $fillable = ['name', 'amount'];

    public function categories()
    {
        return $this->belongsToMany('App\Category');
    }

    public function meta()
    {
        return $this->hasOne('App\ProductMeta');
    }
}

製品メタモデル

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ProductMeta extends Model
{
    protected $fillable = ['product_id', 'title', 'description', 'keywords'];

    public function product()
    {
        return $this->belongsTo('App\Product');
    }
}

これで私を助けてください。

4

1 に答える 1

3

私はそれを解決し、将来の参考のためにここにコードを投稿しています。おそらく、同じ解決策に苦労している他の人を助けることができます.

これが正しい方法かどうかはわかりませんが、これが私/私が探していたものです:

コントローラーメソッドは次のとおりです。

public function postImportProducts(Request $request)
{
    $getSheetName = Excel::load($request->file('productsFile'))->getSheetNames();

    foreach($getSheetName as $sheetName)
    {
        if ($sheetName === 'Product-General-Table')
        {
            DB::statement('SET FOREIGN_KEY_CHECKS=0;');

            DB::table('products')->truncate();

            Excel::selectSheets($sheetName)->load($request->file('productsFile'), function ($reader)
            {
                foreach($reader->toArray() as $sheet)
                {
                    Product::create($sheet);
                }
            });

            DB::statement('SET FOREIGN_KEY_CHECKS=1;');

            //var_dump('product general done');
        }

        if ($sheetName === 'Product-Meta-Table')
        {

            // dd('loading meta');

            DB::statement('SET FOREIGN_KEY_CHECKS=0;');

            DB::table('product_metas')->truncate();

            Excel::selectSheets($sheetName)->load($request->file('productsFile'), function ($reader)
            {    
                foreach($reader->toArray() as $sheet)
                {
                    ProductMeta::create($sheet);
                }
            });

            DB::statement('SET FOREIGN_KEY_CHECKS=1;');
            //var_dump('product meta done');
        }
    }

    Session::flash('file_uploaded_successfully', 'File has been uploaded successfully and has also updated the database.');

    return redirect('/import-products');
}
于 2015-07-16T11:01:51.847 に答える