Hướng dẫn sql to json php
Cơ sở dữ liệu SQL có xu hướng cứng nhắc. Show Nếu bạn đã làm việc với họ, bạn sẽ đồng ý rằng thiết kế cơ sở dữ liệu mặc dù nó có vẻ dễ dàng hơn, là thực tế phức tạp hơn nhiều. Cơ sở dữ liệu SQL tin vào cấu trúc, đó là lý do tại sao nó được gọi là ngôn ngữ truy vấn có cấu trúc. Ở phía bên kia đường chân trời, chúng ta có cơ sở dữ liệu NoSQL, còn được gọi là các cơ sở dữ liệu ít lược đồ nhằm khuyến khích sự linh hoạt. Trong cơ sở dữ liệu ít giản đồ hơn, không có giới hạn cấu trúc áp đặt, chỉ cần lưu dữ liệu. Mặc dù mọi công cụ đều có trường hợp sử dụng, nhưng đôi khi mọi thứ lại đòi hỏi cách tiếp cận lai. Điều gì sẽ xảy ra nếu bạn có thể cấu trúc một số bộ phận cơ sở dữ liệu và để những người khác linh động? MySQL phiên bản 5.7.8 giới thiệu một kiểu dữ liệu JSON cho phép bạn hoàn thành điều đó. Trong hướng dẫn này, bạn sẽ học.
Tại sao nên sử dụng JSONTại thời điểm này, bạn có thể tự hỏi mình tại sao bạn lại muốn sử dụng JSON khi MySQL đã đáp ứng được nhiều nhu cầu về cơ sở dữ liệu ngay cả trước khi nó giới thiệu một kiểu dữ liệu JSON. Câu trả lời nằm trong các trường hợp sử dụng mà bạn có thể sử dụng cách tiếp cận thực hiện thay đổi. Hãy để tôi giải thích với một ví dụ. Giả sử bạn đang xây dựng một ứng dụng web, nơi bạn phải lưu cấu hình / sở thích của người dùng trong cơ sở dữ liệu. Nói chung, bạn có thể tạo một bảng cơ sở dữ liệu riêng biệt với id, user_id, key, và valuecác lĩnh vực hoặc lưu nó như là một chuỗi định dạng mà bạn có thể phân tích tại thời gian chạy. Tuy nhiên, điều này hoạt động tốt cho một số lượng nhỏ người dùng. Nếu bạn có khoảng một nghìn người dùng và năm phím cấu hình, bạn đang tìm kiếm một bảng với 5000 bản ghi lưu trữ một tính năng rất nhỏ trong ứng dụng của bạn. Hoặc nếu bạn đang dùng định dạng chuỗi tuyến đường, mã không liên quan chỉ làm cho tải máy chủ của bạn. Sử dụng trường dữ liệu JSON để lưu cấu hình của người dùng trong trường hợp như vậy có thể giải phóng không gian của bảng cơ sở dữ liệu và giảm số lượng các bản ghi, được lưu riêng rẽ, giống như số lượng người dùng. Và bạn sẽ nhận được lợi ích bổ sung là không phải viết bất kỳ mã phân tích JSON nào, ORM hoặc thời gian chạy ngôn ngữ sẽ giải quyết nó. SchemaTrước khi chúng ta lặn vào sử dụng tất cả các công cụ JSON mát mẻ trong MySQL, chúng ta sẽ cần một cơ sở dữ liệu mẫu để chơi với. Vì vậy, chúng ta hãy lấy lược đồ cơ sở dữ liệu của chúng ta ra trước. Chúng tôi sẽ xem xét trường hợp sử dụng của một cửa hàng trực tuyến chứa nhiều thương hiệu và nhiều loại thiết bị điện tử. Vì các thiết bị điện tử khác nhau có các thuộc tính khác nhau (so sánh Macbook với Máy hút bụi) mà người mua quan tâm, điển hình là mẫu mô hình Thuộc tính-Thuộc tính (EAV) được sử dụng. Tuy nhiên, vì bây giờ chúng ta có tùy chọn để sử dụng kiểu dữ liệu JSON, chúng ta sẽ bỏ EAV. Đối với một sự khởi đầu, cơ sở dữ liệu của chúng tôi sẽ được đặt tên e_storevà có ba bảng chỉ tên, brands, categories, và productstương ứng. Các bảng brandsvà categoriesbảng của chúng ta sẽ khá giống nhau, mỗi bảng có một idvà một nametrường.
Mục tiêu của hai bảng này là để chứa các loại sản phẩm và thương hiệu cung cấp các sản phẩm này. Trong khi chúng tôi đang ở đó, chúng ta hãy tiếp tục và đưa một số dữ liệu vào các bảng này để sử dụng sau.
Bảng thương hiệu Bảng phân loại Tiếp theo, là lĩnh vực kinh doanh của hướng dẫn này. Chúng tôi sẽ tạo ra một productsbảng với id, name, brand_id, category_id, và attributescác lĩnh vực.
Định nghĩa bảng của chúng tôi xác định các ràng buộc khoá ngoại đối với trường brand_idvà category_idtrường, xác định rằng chúng tham chiếu đến bảng brandsvà categoriestương ứng. Chúng tôi cũng đã chỉ định rằng các hàng được tham chiếu không được phép xóa và nếu được cập nhật, các thay đổi cũng nên phản ánh trong tài liệu tham khảo là tốt. Kiểu attributescột của trường đã được khai báo là JSON là kiểu dữ liệu gốc có sẵn trong MySQL. Điều này cho phép chúng ta sử dụng các cấu trúc JSON liên quan khác nhau trong MySQL trên attributeslĩnh vực của chúng tôi . Đây là một sơ đồ quan hệ thực thể của cơ sở dữ liệu được tạo ra của chúng tôi. Cơ sở dữ liệu e_store Thiết kế cơ sở dữ liệu của chúng tôi không phải là tốt nhất về hiệu quả và chính xác. Không có cột giá trong productsbảng và chúng tôi có thể làm gì với việc đưa sản phẩm vào nhiều loại. Tuy nhiên, mục đích của hướng dẫn này không phải là để dạy thiết kế cơ sở dữ liệu mà là làm thế nào để mô hình các đối tượng có tính chất khác nhau trong một bảng bằng cách sử dụng các tính năng JSON của MySQL. Các hoạt động CRUDChúng ta hãy xem cách tạo, đọc, cập nhật và xóa dữ liệu trong một trường JSON. CreateTạo một bản ghi trong cơ sở dữ liệu với một trường JSON khá đơn giản. Tất cả bạn cần làm là thêm JSON hợp lệ làm giá trị trường trong câu lệnh chèn của bạn.
Bảng sản phẩm sau khi thêm tivi Thay vì tự đặt ra đối tượng JSON, bạn cũng có thể sử dụng JSON_OBJECTchức năng tích hợp. Các JSON_OBJECTchức năng chấp nhận một danh sách các cặp khóa / giá trị theo hình thức JSON_OBJECT(key1, value1, key2, value2, ... key(n), value(n))và trả về một đối tượng JSON.
Bảng sản phẩm sau khi thêm điện thoại di động Chú ý JSON_ARRAYhàm trả về mảng JSON khi truyền một tập các giá trị. Nếu bạn chỉ định một phím nhiều lần, chỉ cặp khóa / giá trị đầu tiên sẽ được giữ lại. Điều này được gọi là chuẩn hóa JSON trong các điều khoản của MySQL. Ngoài ra, như là một phần bình thường, các phím đối tượng được sắp xếp và thêm khoảng trắng giữa các cặp khóa / giá trị được loại bỏ. Một chức năng khác mà chúng ta có thể sử dụng để tạo các đối tượng JSON là JSON_MERGEhàm. Các JSON_MERGEchức năng có nhiều đối tượng JSON và tạo ra một, tổng hợp đối tượng duy nhất.
Bảng sản phẩm sau khi thêm máy ảnh Có rất nhiều điều xảy ra trong các câu lệnh chèn này và nó có thể gây nhầm lẫn. Tuy nhiên, nó là khá đơn giản. Chúng ta chỉ truyền các đối tượng đến JSON_MERGEchức năng. Một số trong số chúng đã được xây dựng bằng cách sử dụng JSON_OBJECTchức năng mà chúng ta đã thấy trước đó trong khi các phần khác đã được truyền như là chuỗi JSON hợp lệ. Trong trường hợp JSON_MERGEchức năng, nếu một phím được lặp đi lặp lại nhiều lần, giá trị của nó sẽ được giữ lại như một mảng trong đầu ra. Một bằng chứng của khái niệm là theo thứ tự tôi giả sử.
Chúng ta có thể xác nhận tất cả các truy vấn của chúng tôi đã được chạy thành công bằng cách sử dụng các JSON_TYPEchức năng mà cho chúng ta các loại giá trị trường.
ReadPhải, chúng tôi có một vài sản phẩm trong cơ sở dữ liệu của chúng tôi để làm việc. Đối với các giá trị MySQL điển hình không thuộc kiểu JSON, mệnh đề where ở vị trí khá thẳng. Chỉ cần chỉ định cột, toán tử, và các giá trị bạn cần làm việc. Tóm lại, khi làm việc với các cột JSON, điều này không hiệu quả.
Khi bạn muốn thu hẹp các hàng bằng trường JSON, bạn nên làm quen với khái niệm biểu thức đường dẫn. Định nghĩa đơn giản nhất về biểu thức đường dẫn (nghĩ rằng bộ chọn JQuery) được sử dụng để chỉ định phần nào của tài liệu JSON hoạt động. Phần thứ hai của câu đố là JSON_EXTRACTchức năng chấp nhận một biểu thức đường dẫn để điều hướng qua JSON. Hãy để chúng tôi nói rằng chúng tôi quan tâm đến phạm vi của truyền hình có ít nhất một cổng USB và HDMI.
Chọn các bản ghi theo thuộc tính JSON Đối số đầu tiên của JSON_EXTRACThàm là JSON để áp dụng biểu thức đường dẫn đến attributescột. Các $biểu tượng tokenizes đối tượng để làm việc với. Các $.ports.usbvà $.ports.hdmibiểu thức đường dẫn dịch để "lấy chìa khóa usb dưới cổng" và "lấy cái chìa khóa hdmi dưới cổng" tương ứng. Một khi chúng tôi đã chiết xuất các phím chúng tôi quan tâm, nó là khá đơn giản để sử dụng các nhà khai thác MySQL như >trên chúng. Ngoài ra, JSON_EXTRACTchức năng có bí danh ->mà bạn có thể sử dụng để làm cho truy vấn của bạn dễ đọc hơn. Sửa lại truy vấn trước đó của chúng tôi.
UpdateĐể cập nhật giá trị JSON, chúng ta sẽ sử dụng JSON_INSERT, JSON_REPLACEvà JSON_SETcác chức năng. Các hàm này cũng yêu cầu một biểu thức đường dẫn để xác định các phần của đối tượng JSON cần sửa đổi. Đầu ra của các hàm này là một đối tượng JSON hợp lệ với những thay đổi được áp dụng. Hãy để chúng tôi sửa đổi tất cả các điện thoại di động để có một tài sản chipset là tốt.
Điện thoại di động cập nhật Các $.chipsetbiểu thức đường dẫn xác định vị trí của các chipsettài sản để được ở gốc của đối tượng. Hãy để chúng tôi cập nhật các thuộc chipsettính để được thêm mô tả bằng cách sử dụng JSON_REPLACEchức năng.
Điện thoại di động cập nhật Dễ dàng peasy! Cuối cùng, chúng tôi có JSON_SETchức năng mà chúng tôi sẽ sử dụng để chỉ định TV của chúng tôi là khá đầy màu sắc.
TV cập nhật Tất cả những chức năng này có vẻ giống nhau nhưng có một sự khác biệt trong cách họ cư xử. Các JSON_INSERTchức năng sẽ chỉ làm tăng thêm tài sản cho đối tượng nếu nó không tồn tại rồi. Các JSON_REPLACEchức năng thay thế các tài sản duy nhất nếu nó được tìm thấy. Các JSON_SETchức năng sẽ bổ sung thêm tài sản nếu nó không được tìm thấy gì khác thay thế nó. DeleteCó hai phần để xóa mà chúng tôi sẽ xem xét. Đầu tiên là xóa một khóa / giá trị nhất định khỏi cột JSON của bạn, trong khi thứ hai là xóa các hàng sử dụng cột JSON. Hãy cho chúng tôi biết chúng tôi không còn cung cấp mount_typethông tin cho máy ảnh và muốn xóa nó cho tất cả các máy ảnh. Chúng ta sẽ làm điều đó bằng cách sử dụng JSON_REMOVEhàm trả về giá trị JSON đã cập nhật sau khi gỡ bỏ khoá được xác định dựa trên biểu thức đường dẫn.
Máy ảnh sau khi gỡ bỏ thuộc tính mount_type Đối với trường hợp thứ hai, chúng tôi cũng không cung cấp điện thoại di động nữa mà có phiên bản Jellybean của hệ điều hành Android.
Chúng tôi không bán Jellybeans nữa! Như đã đề cập trước đó, làm việc với một thuộc tính cụ thể đòi hỏi phải sử dụng JSON_EXTRACTchức năng này để áp dụng LIKEtoán tử, trước tiên chúng ta đã khai thác ostài sản của mobilephones (với sự trợ giúp của category_id) và xóa tất cả các bản ghi có chứa chuỗi Jellybean. Mồi cho các ứng dụng WebNhững ngày tháng làm việc trực tiếp với cơ sở dữ liệu đang ở đằng sau chúng ta. Ngày nay, các khuôn khổ bảo vệ các nhà phát triển khỏi các hoạt động cấp thấp hơn và nó hầu như cảm thấy xa lạ đối với một khuôn khổ cuồng tín không thể dịch được kiến thức cơ sở dữ liệu của mình thành một người lập bản đồ quan hệ đối tượng. Với mục đích không để các nhà phát triển như vậy đau lòng và tự hỏi về sự tồn tại và mục đích của họ trong vũ trụ, chúng ta sẽ xem xét làm thế nào để đi về kinh doanh của các cột JSON trong khuôn khổ Laravel. Chúng tôi sẽ chỉ tập trung vào các phần trùng lặp với chủ đề của chúng tôi đề cập đến các cột JSON. Một hướng dẫn chuyên sâu về khung công tác Laravel vượt quá phạm vi của phần này. Tạo MigrationĐảm bảo cấu hình ứng dụng Laravel của bạn để sử dụng cơ sở dữ liệu MySQL. Chúng tôi sẽ tạo ra ba di cư cho brands, categoriesvà products tương ứng.
Việc di chuyển create_brandsvà create_categorieslà khá tương tự và và một quy định cho các nhà phát triển Laravel.
Việc create_productsdi chuyển cũng sẽ có các chỉ thị cho các chỉ mục và khoá nước ngoài.
Chú ý đến $table->json('attributes');tuyên bố trong quá trình di chuyển. Cũng giống như việc tạo bất kỳ trường bảng nào bằng cách sử dụng kiểu dữ liệu có tên thích hợp, chúng tôi đã tạo một cột JSON sử dụng jsonphương pháp có tên attributes. Ngoài ra, điều này chỉ hoạt động cho các công cụ cơ sở dữ liệu hỗ trợ các kiểu dữ liệu JSON. Các động cơ, chẳng hạn như các phiên bản cũ của MySQL sẽ không thể thực hiện các di chuyển này. Tạo modelsKhác với hiệp hội, không cần thiết phải thiết lập mô hình của chúng tôi nên chúng ta hãy chạy nhanh họ.
Một lần nữa, Productmô hình của chúng tôi cần một đề cập đặc biệt. Các $castsmảng trong đó có chìa khóa attributescác thiết lập để arrayđảm bảo bất cứ khi nào một sản phẩm được lấy từ cơ sở dữ liệu, đó là attributesJSON được chuyển đổi sang một mảng liên quan. Chúng ta sẽ thấy sau trong hướng dẫn làm thế nào điều này tạo điều kiện cho chúng ta cập nhật hồ sơ từ các hành động điều khiển của chúng tôi. Hoạt động Tài nguyênTạo một sản phẩm Phát biểu của bảng điều khiển dành cho quản trị viên, các thông số để tạo ra một sản phẩm có thể đi qua các tuyến đường khác nhau vì chúng tôi có một số loại sản phẩm. Bạn cũng có thể có các chế độ xem khác nhau để tạo, chỉnh sửa, hiển thị và xóa một sản phẩm. Ví dụ: một biểu mẫu để thêm máy ảnh yêu cầu các trường nhập khác nhau hơn là một biểu mẫu để thêm điện thoại di động để chúng bảo đảm các chế độ xem riêng biệt. Hơn nữa, khi bạn có dữ liệu đầu vào của người dùng, bạn sẽ có thể chạy nó thông qua trình xác nhận yêu cầu, riêng cho máy ảnh và mỗi điện thoại di động. Bước cuối cùng là tạo ra sản phẩm thông qua Sự say mê. Chúng tôi sẽ tập trung vào tài nguyên máy ảnh cho phần còn lại của hướng dẫn này. Các sản phẩm khác có thể được giải quyết bằng cách sử dụng mã sản xuất theo cách tương tự. Giả sử chúng ta đang lưu một máy ảnh và các lĩnh vực biểu mẫu được đặt tên là các thuộc tính máy ảnh tương ứng, đây là hành động điều khiển.
Tìm nạp sản phẩm Nhớ lại $castsmảng mà chúng ta tuyên bố trước đó trong Productmô hình. Nó sẽ giúp chúng ta đọc và sửa một sản phẩm bằng cách xử lý các thuộc tính như một mảng kết hợp.
Quan điểm của bạn sẽ sử dụng $camerabiến theo cách sau.
Chỉnh sửa sản phẩm Như được hiển thị trong phần trước, bạn có thể dễ dàng tìm nạp sản phẩm và chuyển nó đến chế độ xem, trong trường hợp này sẽ là chế độ xem chỉnh sửa. Bạn có thể sử dụng biến sản phẩm để điền trước các trường biểu mẫu trên trang chỉnh sửa. Việc cập nhật sản phẩm dựa vào đầu vào của người dùng sẽ khá giống với storehành động mà chúng ta đã thấy trước đó, thay vì tạo một sản phẩm mới, bạn sẽ lấy nó từ cơ sở dữ liệu trước khi cập nhật. Tìm kiếm dựa trên các thuộc tính JSON Phần cuối cùng của câu đố vẫn còn để thảo luận là truy vấn các cột JSON sử dụng ORM say mê. Nếu bạn có trang tìm kiếm cho phép tìm kiếm các camera dựa trên các thông số kỹ thuật do người dùng cung cấp, bạn có thể làm như sau với mã sau đây.
Các bản ghi thu được bây giờ sẽ có sẵn cho product.camera.searchchế độ xem dưới dạng một $camerasbộ sưu tập. Xóa một sản phẩm Sử dụng thuộc tính cột không phải là JSON, bạn có thể xóa các sản phẩm bằng cách chỉ định mệnh đề where và sau đó gọi deletephương thức đó. Ví dụ, trong trường hợp của một ID.
Kết luậnChúng ta hầu như không bị trầy xước bề mặt khi sử dụng cột JSON trong MySQL. Bất cứ khi nào bạn cần lưu dữ liệu dưới dạng cặp khóa / giá trị trong một bảng riêng biệt hoặc làm việc với các thuộc tính linh hoạt cho một thực thể, bạn nên xem xét sử dụng trường loại dữ liệu JSON vì nó có thể đóng góp rất nhiều cho việc nén thiết kế cơ sở dữ liệu của bạn. Nếu bạn quan tâm đến việc lặn sâu hơn, tài liệu MySQL là một tài nguyên tuyệt vời để khám phá khái niệm JSON hơn nữa. Tôi hy vọng bạn tìm thấy hướng dẫn này thú vị và am hiểu. Cho đến đoạn tiếp theo của tôi, vui mã hóa! Tham khảo
|