0

これは、ファイルを取得して各行をループするストア メソッドです。

public function store()
    {
        $input = Input::file('statuses');
        $filename = $input->getRealPath();
        $i = 0;

        $rows = Excel::load($filename, null, 'ISO-8859-1')->get()->toArray();

        foreach($rows as $k => $row)
        {
            if(!isset($err)) {
                if (!$this->repository->create($row))
                    $err = 'Error importing row ' + $i;
                    $i++;
                }
        }

        if(isset($err)) {
            Flash::error($err);
            return Redirect::route('admin.importstatus.index');
        }

        Flash::success('Statuses Imported!');
        return Redirect::route('admin.statuses.index');
    }

私のリポジトリでは、私の create メソッドは次のようになります。

public function create(array $data)
{
    // Create the model
    $model = $this->model->fill($data);

    if ($model->save()) {
        return $model;
    }

    return false;
}

さて、6行をインポートすると何が起こっているように見えますが、実際には最終行だけがDBに挿入されています。

create メソッドで var_dump を実行すると、次のものが返されます。

    array (size=7)
  'content' => string 'Imported two' (length=12)
  'status' => float 0
  'user_id' => float 1
  'pinned' => float 0
  'updated_at' => string '2015-06-28 16:13:22' (length=19)
  'created_at' => string '2015-06-28 16:13:22' (length=19)
  'id' => int 8
array (size=7)
  'content' => string 'Imported three' (length=14)
  'status' => float 0
  'user_id' => float 1
  'pinned' => float 0
  'updated_at' => string '2015-06-28 16:13:22' (length=19)
  'created_at' => string '2015-06-28 16:13:22' (length=19)
  'id' => int 8
array (size=7)
  'content' => string 'Imported four' (length=13)
  'status' => float 0
  'user_id' => float 1
  'pinned' => float 0
  'updated_at' => string '2015-06-28 16:13:22' (length=19)
  'created_at' => string '2015-06-28 16:13:22' (length=19)
  'id' => int 8

各 ID がすべて no であることに注意してください。8 (テーブルで次に使用可能な行)。テーブルIDはデフォルトのAUTO INCREMENTなどなので問題はありません。論理的な問題だと思いますか? 何か案は?

4

1 に答える 1

1

モデルの同じインスタンスを何度も使用しているようです。

fill() を変更してみてください:

$this->model->fill($data);

create() を使用:

$this->model->create($data);

fill() を使用すると、既に作成されたモデル インスタンスにデータを入力するだけです。ただし、create() を使用する場合は、最初に (新しい ID で) 新しいインスタンスを作成し、次にデータを入力してから保存します。

重要

create()を使用すると、データベースにも永続化されます。つまり、手動でsave()する必要はありません。

于 2015-06-28T16:25:53.603 に答える