Досить часто виникає потреба занесення інформації з файлів в базу даних. Одним із способів вирішення цієї задачі є: відкриття файлу, через підрядник зчитувати файл, розбивати рядок по разделителю і заносити в базу. Але в такому випадку може виникнути проблема в швидкості імпорту, якщо файл буде занадто великий.
Для вирішення даної проблеми можна скористатися оператором MySQL LOAD DATA INFILE. LOAD DATA INFILE дозволяє завантажувати інформацію з файлів з великою швидкістю, що нам і потрібно.
Але у цього методу я помітив свої плюси і мінуси:
- - немає можливості відстежувати коректність даних, що вводяться
- + швидкість завантаження вражає
Уявімо ситуацію, що нам потрібно вивантажувати в БД прайс-листи організацій. Для цього потрібно буде зробити форму з можливістю вибору файлу і кнопкою для занесення файлу в базу.
Для початку створимо таблицю tbl_price, де будемо зберігати інформацію про прайс-листі.
id_user буде зовнішнім ключем для зв'язку організації і прайс-листа.
Створимо файл який будемо імпортувати
створення моделі
Створюємо модель для таблиці tbl_price генератором коду gii. Додаємо метод імпорту файлу в клас моделі Price.
Розберемо докладніше команду LOAD DATA LOCAL INFILE.
LOCAL говорить про те, що файл буде братися з директорії клієнтського сервера, якщо ж написати просто LOAD DATA INFILE, то файл буде братися з директорії сервера SQL.
FIELDS TERMINATED BY говорить про те яким чином відокремлюються одна від одної поля в нашому випадку це «;» крапка з комою.
LINES TERMINATED BY говорить про те яким чином будуть розділятися рядки, у нас це символ переходу на новий рядок.
IGNORE 1 LINES кількість пропускаються рядків зверху, пропускаємо одну оскільки у нас є шапка, якщо заголовки стовпців не використовувати те можна цей параметр не писати.
Далі в дужках вказуємо ті параметри, які будуть заноситися в базу з файлу, ВАЖЛИВО вказати ту послідовність стовпців БД, яку вказали в файлі тобто якщо в базі стовпці йдуть «ціна», «кількість», «од-ізм» а в файлі імпорту «од-ізм», «ціна», «кількість» то в SQL запиті слід вказувати «од-ізм» , «ціна», «кількість».
Також при копіюванні файлу в базу даних може виникнути ситуація, коли в файлі імпорту зберігається не вся необхідна інформація. У нашому випадку це id організації кому належить прайс і час формування прайса. Для цього потрібно використовувати SET де ми присвоюємо date_price поточну дату і id_user id організації.
Оскільки коректність даних, що вводяться в цьому способі перевірити не можна (якщо можна, то поділіться як), то змінимо rules в нашій моделі.
Тут я створив сценарій import_csv, де ведеться контроль розширення обраного користувачем файлу. Розширення я вибрав csv, але воно може бути і іншим.
створення уявлення
Створимо клас уявлення Price і внесемо в нього наступний код.
Ну тут все просто, єдиний момент на який варто звернути увагу це
інакше поле activeFileField буде повертати пусте значення.
створення контролера
Створимо контролер PriceController і в ньому actionImport з наступним кодом.