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?