質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

947閲覧

シーダー読み込み時に、データベースにcreated_atの登録処理が2回走りエラーになる

bokupiroki

総合スコア54

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2023/03/23 09:58

編集2024/03/06 12:55

実現したいこと

シーダー経由で、CSVからデータベースにデータの登録を行いたい

前提

LaravelでCSVの内容をシーダー経由でMysqlに登録したいです。

しかし、シーダーを読み込ませようとするとcreated_atカラムがテーブルに存在していないかのようなエラーが出てしまいます。

発生している問題・エラーメッセージ

bash

1#docker-compose exec app bash 2root@8340ff6d38bb:/work# php artisan db:seed --class=InquiryTableSeeder 3 4 Illuminate\Database\QueryException 5 6 7 8 9```php 10//InquiryTableSeeder.php 11<?php 12 13namespace Database\Seeders; 14use Illuminate\Support\Facades\DB; 15use DateTime; 16use Illuminate\Database\Seeder; 17use App\Models\Inquiry; 18use Illuminate\Support\Arr; 19 20class InquiryTableSeeder extends Seeder 21{ 22 /** 23 * Run the database seeds. 24 * 25 * @return void 26 */ 27 public function run() 28 { 29 //ここに読み込ませたいCSV 30 $file = new \SplFileObject(storage_path('app/private/csv/inquiries_migration.csv')); 31 $file->setFlags( 32 \SplFileObject::READ_CSV | 33 \SplFileObject::READ_AHEAD | 34 \SplFileObject::SKIP_EMPTY | 35 \SplFileObject::DROP_NEW_LINE 36 ); 37 38 foreach ($file as $i => $line) { 39 if ($i === 0) { 40 $headers = $line; 41 continue; 42 } 43 44 45 // ['created_at' => 'taro'] のようにヘッダ行とデータ行を結合 46 $values = array_combine($headers, $line); 47 48 // 空白文字を含む可能性があるカラムの値から空白文字を削除 49 $values['serial'] = trim($values['serial'] ?? ''); 50 $values['type'] = trim($values['type'] ?? ''); 51 52 53 54 55 if (isset($values['phoneNumber']) && !empty($values['phoneNumber'])) { 56 $phoneNumberWithoutHyphen = preg_replace('/[^0-9]/', '', $values['phoneNumber']); // 数字以外の文字列を除去 57 $values['PhoneNumberWithoutHyphen'] = $phoneNumberWithoutHyphen; 58 } 59 60 // 改行コードをリアル改行として扱う 61 $values['question'] = str_replace(['\n', '<br>'], "\n", $values['question']); 62 $values['answer'] = str_replace(['\n', '<br>'], "\n", $values['answer']); 63 64 65 // created_atカラムが存在し、空でない場合 66 if (isset($values['created_at']) && !empty($values['created_at'])) { 67 //inquiry_idが同じレコードが既にあるなら更新、なければ作成 68 Inquiry::updateOrCreate( 69 ['inquiry_id' => $values['inquiry_id']], 70 Arr::except($values, ['inquiry_id']) 71 ); 72 } else {//created_atカラムが空だったり想定されない値の場合は1970-01-01を入力 73 //$values['created_at'] = new DateTime('1970-01-01'); 74 75 //inquiry_idが同じレコードが既にあるなら更新、なければ作成 76 Inquiry::updateOrCreate( 77 ['inquiry_id' => $values['inquiry_id']], 78 Arr::except($values, ['inquiry_id']) 79 ); 80 81 } 82 } 83 84 } 85 86 }

試したこと

php artisan cache:clear
php artisan config:clear
サーバー再起動も行いましたが同じです。

気になる点としては、開発環境のMAC上で同じことを行ってもエラーにならないのに、
本番環境のubuntuの実機で同じことを行うとエラーになります。
本番環境にはsshに入っています。

追記

YT0014さんより指摘があった通り、

シーダー実行時のエラーに

おそらく、csvファイル上に存在するcreated_atの値と、現在のタイムスタンプの両方を入力しようとしてしまっているのではないかと思います。

csvファイル上のcreated_atだけを使いたいのですが、何か方法はないでしょうか。

モデル側でタイムスタンプの自動挿入を無効にする方法もあるかとは思いますが、それだと影響範囲が大きいので別の方法があればありがたいです。

補足情報(FW/ツールのバージョンなど)

Docker version 23.0.1, build a5ee5b1
docker-compose version 1.29.2, build unknown
Laravel8
PHP 8.0.28 (cli) (built: Mar 1 2023 13:21:15) ( NTS )

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

csvファイルを削除して作り直したら解決しました。
切り分けのため編集しているうちの文字コードが変わってしまったとかなのかもしれません。

投稿2023/04/01 04:11

bokupiroki

総合スコア54

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SQLが間違っています。
カラムリストに、created_at が、2番目と最後の2回、指定されています。

投稿2023/03/23 11:28

YT0014

総合スコア1708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bokupiroki

2023/03/23 11:49

ありがとうございます! たしかに、エラーをよくみるとcreated_atが2回登場していますね ちょっと本番環境が触れる場所を離れてしまったのですが、csvにcreated_atが2回登場しているか、 自動でcreated_atをもう一度登録するようなシーダーの書き方になってるってことですよね? 後者な気がしてきました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問