comment mettre à jour les données dans la base de données avec import Excel. j'utilise laravel 5.7 et maatwebsite 3.1
c'est mon contrôleur:
array:1 [â¼ 0 => array:8 [â¼ 0 => array:3 [â¼ "id" => 1.0 "produk" => "Pomade" "harga" => 90000.0 ] 1 => array:3 [â¼ "id" => 2.0 "produk" => "Shampoo" "harga" => 90000.0 ] 2 => array:3 [â¼ "id" => 3.0 "produk" => "Sikat WC" "harga" => 90000.0 ] ] ]
Ceci est ma classe d'importation:
<?php namespace App\Imports; use App\Produk; use Maatwebsite\Excel\Concerns\ToModel; use Maatwebsite\Excel\Concerns\WithHeadingRow; class ProdukImport implements ToModel, WithHeadingRow { /** * @param array $row * * @return \Illuminate\Database\Eloquent\Model|null */ public function model(array $row) { return new Produk([ 'id_produk' => $row['id'], 'nama_produk' => $row['produk'], 'harga_jual' => $row['harga'] ]); } }
ce résultat dd ($ data):
public function import() { $data = Excel::toArray(new ProdukImport, request()->file('file')); if ($data) { DB::table('produk') ->where('id_produk', $data['id']) ->update($data); } }
le résultat $ data provient de ceci: $ data = Excel :: toArray (new ProdukImport, request () -> file ('file'));
3 Réponses :
Voici une fonction simple pour insérer des données sur db à l'aide d'un fichier Excel.
public function importData(Request $request){ if($request->hasFile('sample_file')){ $path = $request->file('sample_file')->getRealPath(); $data = \Excel::load($path)->get(); if($data->count()){ foreach ($data as $key => $value) { $arr[] = ['name' => $value->name, 'details' => $value->details]; } if(!empty($arr)){ \DB::table('table_name')->insert($arr); dd('Insert Record successfully.'); } } }
Ce n'est pas ce que veut OP.
@Rahmat ce que vous obtenez dans $data
?
@Javed je n'obtiens rien dans $ data
qu'est-ce que vous obtenez dans $request
?
@Javed même, mais quand $ data utilise comme ça $ data = Excel :: toArray (new ProdukImport, request () -> file ('file')); j'ai des données dans le tableau: array: 1 [▼ 0 => array: 8 [▼ 0 => array: 3 [▼ "id" => 1.0 "produk" => "Pomade" "harga" => 90000.0] 1 = > tableau: 3 [▶] 2 => tableau: 3 [▶] 3 => tableau: 3 [▶] 4 => tableau: 3 [▶] 5 => tableau: 3 [▶] 6 => tableau: 3 [ ▶] 7 => tableau: 3 [▶]]]
Pouvez-vous expliquer pourquoi vous pensez que cela résout le problème? Ajoutez une telle explication à la réponse elle-même afin que les autres puissent apprendre de votre réponse
En fonction de la structure de votre tableau $data
, vous pourriez probablement obtenir ce que vous voulez avec quelque chose comme ceci:
public function import() { $data = Excel::toArray(new ProdukImport, request()->file('file')); return collect(head($data)) ->each(function ($row, $key) { DB::table('produk') ->where('id_produk', $row['id']) ->update(array_except($row, ['id'])); }); }
Je l'ai essayé et j'ai eu cette erreur: SQLSTATE [42S22]: [Microsoft] [Pilote ODBC 11 pour SQL Server] [SQL Server] Nom de colonne non valide «id». (SQL: update [produk] set [id] = 1, [produk] = Pomade, [harga] = 90000 où [id_produk] = 1) dans mon fichier Excel, tableau d'en-tête comme celui-ci: Id | Produk | Harga et dans ma base de données la table comme ceci: id_produk | nama_produk | harga_jual. Il y a quelque chose qui ne va pas dans ma table d'en-tête dans le fichier Excel?
J'ai modifié ma réponse, mais je suis confus. Avez-vous un champ appelé id
dans produk
?
dans ma base de données, j'utilise id_produk dans la table produk. Et dans mon fichier Excel d'en-tête, j'utilise l'identifiant
Je comprends. Je pense que la réponse mise à jour devrait faire l'affaire. Laisse moi savoir si ça fonctionne :)
J'ai eu le même problème. Voici comment je l'ai fait.
Ma manette ressemble à ceci:
public function model(array $row) { $product = new Product(); // row[0] is the ID $product = $product->find($row[0]); // if product exists and the value also exists if ($product and $row[3]){ $product->update([ 'price'=>$row[3] ]); return $product; } }
Et c'est la méthode du model
sur ma classe ProductImport
public function import(Request $request){ try { Excel::import(new ProductImport, $request->file('file')->store('temp') ); return redirect()->back()->with('response','Data was imported successfully!'); } catch (\Exception $exception){ return redirect()->back()->withErrors(["msq"=>$exception->getMessage()]); } }
Quelle est la sortie de
dd($data)
?tableau: 1 [▼ 0 => tableau: 8 [▼ 0 => tableau: 3 [▼ "id" => 1.0 "produk" => "Pomade" "harga" => 90000.0] 1 => tableau: 3 [▶ ] 2 => tableau: 3 [▶] 3 => tableau: 3 [▶] 4 => tableau: 3 [▶] 5 => tableau: 3 [▶] 6 => tableau: 3 [▶] 7 => tableau : 3 [▶]]]
Pourriez-vous modifier votre question initiale et ajouter le résultat?
ok, j'ai mis à jour ma question
Ajout de ma réponse, faites-nous savoir si cela fonctionne pour vous.
Je l'ai essayé et j'ai eu cette erreur: SQLSTATE [42S22]: [Microsoft] [Pilote ODBC 11 pour SQL Server] [SQL Server] Nom de colonne non valide «id». (SQL: update [produk] set [id] = 1, [produk] = Pomade, [harga] = 90000 où [id_produk] = 1) dans mon fichier Excel, tableau d'en-tête comme celui-ci: Id | Produk | Harga et dans ma base de données la table comme ceci: id_produk | nama_produk | harga_jual. Il y a quelque chose qui ne va pas dans ma table d'en-tête dans le fichier Excel?