Postgresql thay thế các thực thể html
Symfony cung cấp tất cả các công cụ bạn cần để sử dụng cơ sở dữ liệu trong ứng dụng của mình nhờ Doctrine, bộ thư viện PHP tốt nhất để làm việc với cơ sở dữ liệu. Các công cụ này hỗ trợ cơ sở dữ liệu quan hệ như MySQL và PostgreSQL cũng như cơ sở dữ liệu NoSQL như MongoDB Show
Cơ sở dữ liệu là một chủ đề rộng, vì vậy tài liệu được chia thành ba bài viết
Cài đặt DoctrineĐầu tiên, cài đặt hỗ trợ Doctrine qua gói Symfony 48, cũng như MakerBundle, gói này sẽ giúp tạo một số mã1 2
Cấu hình cơ sở dữ liệuThông tin kết nối cơ sở dữ liệu được lưu trữ dưới dạng biến môi trường có tên là 49. Để phát triển, bạn có thể tìm và tùy chỉnh cái này bên trong 501 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
thận trọng Nếu tên người dùng, mật khẩu, tên máy chủ hoặc tên cơ sở dữ liệu chứa bất kỳ ký tự nào được coi là đặc biệt trong URI (chẳng hạn như 51, 52, 53, 54, 55, 56, 57, 58), bạn phải mã hóa chúng. Xem RFC 3986 để biết danh sách đầy đủ các ký tự dành riêng hoặc sử dụng chức năng urlencode để mã hóa chúng. Trường hợp này bạn cần bỏ tiền tố 59 trong 60 để tránh sai sót. 61Bây giờ các tham số kết nối của bạn đã được thiết lập, Doctrine có thể tạo cơ sở dữ liệu 62 cho bạn1 29 0Có nhiều tùy chọn hơn trong 60 mà bạn có thể định cấu hình, bao gồm cả 64 (e. g. 5. 7 nếu bạn đang sử dụng MySQL 5. 7), điều này có thể ảnh hưởng đến cách Doctrine hoạt độngMẹo Còn nhiều lệnh Doctrine khác. Chạy 65 để xem danh sách đầy đủTạo một lớp thực thểGiả sử bạn đang xây dựng một ứng dụng cần hiển thị các sản phẩm. Thậm chí không cần nghĩ về Doctrine hay cơ sở dữ liệu, bạn đã biết rằng bạn cần một đối tượng 66 để đại diện cho những sản phẩm đóBạn có thể sử dụng lệnh 67 để tạo lớp này và bất kỳ trường nào bạn cần. Lệnh sẽ hỏi bạn một số câu hỏi - hãy trả lời chúng như được thực hiện bên dưới 6 7Ái chà. Bây giờ bạn có một tệp 68 mới 9 0Ghi chú Bắt đầu từ v1. 44. 0 - MakerBundle chỉ hỗ trợ các thực thể sử dụng thuộc tính PHP Ghi chú Nhầm lẫn tại sao giá là một số nguyên? . Đây chỉ là một ví dụ. Tuy nhiên, lưu trữ giá dưới dạng số nguyên (e. g. 100 = $1 USD) có thể tránh được vấn đề làm tròn Ghi chú Nếu bạn đang sử dụng cơ sở dữ liệu SQLite, bạn sẽ thấy lỗi sau. PDOException. SQLSTATE[HY000]. Lỗi chung. 1 Không thể thêm cột NOT NULL với giá trị mặc định NULL. Thêm tùy chọn 69 vào thuộc tính 70 để khắc phục sự cốthận trọng Có giới hạn 767 byte cho tiền tố khóa chỉ mục khi sử dụng bảng InnoDB trong MySQL 5. 6 và các phiên bản trước đó. Các cột chuỗi có độ dài 255 ký tự và mã hóa 71 vượt quá giới hạn đó. Điều này có nghĩa là bất kỳ cột nào thuộc loại 72 và 73 phải đặt giá trị tối đa của nó là 74 thành 75. Nếu không, bạn sẽ thấy lỗi này. "[PDOException] SQLSTATE[42000]. Lỗi cú pháp hoặc vi phạm quyền truy cập. 1071 Khóa được chỉ định quá dài; Lớp này được gọi là một "thực thể". Và chẳng bao lâu nữa, bạn sẽ có thể lưu và truy vấn các đối tượng Sản phẩm vào bảng 76 trong cơ sở dữ liệu của mình. Mỗi thuộc tính trong thực thể 66 có thể được ánh xạ tới một cột trong bảng đó. Điều này thường được thực hiện với các thuộc tính. các bình luận 78 mà bạn nhìn thấy trên mỗi tài sảnLệnh 67 là một công cụ giúp cuộc sống dễ dàng hơn. Nhưng đây là mã của bạn. thêm/xóa trường, thêm/xóa phương thức hoặc cập nhật cấu hìnhDoctrine hỗ trợ nhiều loại trường khác nhau, mỗi loại có các tùy chọn riêng. Để xem danh sách đầy đủ, hãy xem tài liệu về Loại ánh xạ của Doctrine. Nếu bạn muốn sử dụng XML thay vì chú thích, hãy thêm 80 và 81 vào ánh xạ thực thể trong tệp 60 của bạnthận trọng Hãy cẩn thận không sử dụng các từ khóa SQL dành riêng làm tên bảng hoặc tên cột của bạn (e. g. 83 hoặc 84). Xem tài liệu từ khóa SQL dành riêng của Doctrine để biết chi tiết về cách thoát khỏi những. Hoặc, thay đổi tên bảng bằng 85 phía trên lớp hoặc định cấu hình tên cột bằng tùy chọn 86di cư. Tạo các bảng/lược đồ cơ sở dữ liệuLớp 66 đã được định cấu hình đầy đủ và sẵn sàng lưu vào bảng 76. Nếu bạn vừa định nghĩa lớp này, cơ sở dữ liệu của bạn thực sự chưa có bảng 76. Để thêm nó, bạn có thể tận dụng DoctrineMigrationsBundle đã được cài đặt1 29 1Nếu mọi thứ hoạt động, bạn sẽ thấy một cái gì đó như thế này 2____03Nếu bạn mở tệp này, nó sẽ chứa SQL cần thiết để cập nhật cơ sở dữ liệu của bạn. Để chạy SQL đó, hãy thực hiện di chuyển của bạn 1 29 5Lệnh này thực thi tất cả các tệp di chuyển chưa được chạy trên cơ sở dữ liệu của bạn. Bạn nên chạy lệnh này trong quá trình sản xuất khi triển khai để luôn cập nhật cơ sở dữ liệu sản xuất của mình Di chuyển & Thêm nhiều trường hơnNhưng nếu bạn cần thêm thuộc tính trường mới vào 66, chẳng hạn như 70 thì sao? . Tuy nhiên, bạn cũng có thể sử dụng lại 67 6 7Điều này thêm thuộc tính 70 mới và các phương thức 94 và 95 8 9Thuộc tính mới được ánh xạ, nhưng nó chưa tồn tại trong bảng 76. Không vấn đề gì. Tạo một di chuyển mới1 29 1Lần này, SQL trong tệp được tạo sẽ trông như thế này 1 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 163 Hệ thống di chuyển thông minh. Nó so sánh tất cả các thực thể của bạn với trạng thái hiện tại của cơ sở dữ liệu và tạo SQL cần thiết để đồng bộ hóa chúng. Giống như trước đây, thực hiện di chuyển của bạn 1 29 5Thao tác này sẽ chỉ thực thi một tệp di chuyển mới, vì DoctrineMigrationsBundle biết rằng lần di chuyển đầu tiên đã được thực hiện trước đó. Đằng sau hậu trường, nó quản lý một bảng 97 để theo dõi điều nàyMỗi khi bạn thực hiện thay đổi đối với lược đồ của mình, hãy chạy hai lệnh này để tạo quá trình di chuyển rồi thực hiện nó. Đảm bảo cam kết các tệp di chuyển và thực thi chúng khi bạn triển khai Mẹo Nếu bạn muốn thêm các thuộc tính mới theo cách thủ công, lệnh 67 có thể tạo các phương thức getter & setter cho bạn1 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 167 Nếu bạn thực hiện một số thay đổi và muốn tạo lại tất cả các phương thức getter/setter, hãy vượt qua 99Các đối tượng liên tục vào cơ sở dữ liệuĐã đến lúc lưu một đối tượng 66 vào cơ sở dữ liệu. Hãy tạo một bộ điều khiển mới để thử nghiệm1 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 169 Bên trong bộ điều khiển, bạn có thể tạo một đối tượng 66 mới, thiết lập dữ liệu trên đó và lưu nó 0 1dùng thử
Xin chúc mừng. Bạn vừa tạo hàng đầu tiên của mình trong bảng 76. Để chứng minh điều đó, bạn có thể truy vấn trực tiếp cơ sở dữ liệu 2 3Hãy xem ví dụ trước chi tiết hơn
Ghi chú Nếu cuộc gọi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1608 không thành công, một ngoại lệ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1613 sẽ được đưa ra. Xem Giao dịch và Đồng thời Cho dù bạn đang tạo hay cập nhật đối tượng, quy trình làm việc luôn giống nhau. Doctrine đủ thông minh để biết liệu nó có nên CHÈN hay CẬP NHẬT thực thể của bạn hay không Xác thực đối tượngTrình xác thực Symfony tái sử dụng siêu dữ liệu Doctrine để thực hiện một số tác vụ xác thực cơ bản 0 5Mặc dù thực thể 66 không xác định bất kỳ cấu hình xác thực rõ ràng nào, Symfony xem xét cấu hình ánh xạ Doctrine để suy ra một số quy tắc xác thực. Ví dụ: nếu thuộc tính 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1615 không thể là 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1616 trong cơ sở dữ liệu, ràng buộc NotNull sẽ tự động được thêm vào thuộc tính (nếu thuộc tính chưa chứa ràng buộc đó) Bảng sau đây tóm tắt ánh xạ giữa siêu dữ liệu Doctrine và các ràng buộc xác thực tương ứng được Symfony tự động thêm vào Thuộc tính Doctrine Ràng buộc xác thựcGhi chú 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1617NotNullYêu cầu cài đặt thành phần PropertyInfo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1618TypeYêu cầu cài đặt thành phần PropertyInfo 73UniqueEntity 74LengthVì thành phần Biểu mẫu cũng như Nền tảng API sử dụng nội bộ thành phần Trình xác thực nên tất cả các biểu mẫu và API web của bạn cũng sẽ tự động được hưởng lợi từ các ràng buộc xác thực tự động này Xác thực tự động này là một tính năng hay để cải thiện năng suất của bạn, nhưng nó không thay thế hoàn toàn cấu hình xác thực. Bạn vẫn cần thêm một số ràng buộc xác thực để đảm bảo rằng dữ liệu do người dùng cung cấp là chính xác Tìm nạp đối tượng từ cơ sở dữ liệuTìm nạp một đối tượng ra khỏi cơ sở dữ liệu thậm chí còn dễ dàng hơn. Giả sử bạn muốn có thể truy cập 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1621 để xem sản phẩm mới của mình 6 7Một khả năng khác là sử dụng 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1622 bằng cách sử dụng hệ thống tự động của Symfony và được tiêm bởi bộ chứa tiêm phụ thuộc 8 9dùng thử
Khi bạn truy vấn một loại đối tượng cụ thể, bạn luôn sử dụng cái được gọi là "kho lưu trữ" của nó. Bạn có thể coi kho lưu trữ là một lớp PHP có nhiệm vụ duy nhất là giúp bạn tìm nạp các thực thể của một lớp nhất định Khi bạn có một đối tượng kho lưu trữ, bạn có nhiều phương thức trợ giúp 1 290 1 291 Bạn cũng có thể thêm các phương thức tùy chỉnh cho các truy vấn phức tạp hơn. Thông tin thêm về điều đó sau trong phần Cơ sở dữ liệu và Học thuyết ORM Mẹo Khi hiển thị trang HTML, thanh công cụ gỡ lỗi web ở cuối trang sẽ hiển thị số lượng truy vấn và thời gian thực hiện chúng Nếu số lượng truy vấn cơ sở dữ liệu quá cao, biểu tượng sẽ chuyển sang màu vàng để cho biết có điều gì đó không đúng. Nhấp vào biểu tượng để mở Symfony Profiler và xem các truy vấn chính xác đã được thực thi. Nếu bạn không thấy thanh công cụ gỡ lỗi web, hãy cài đặt gói Symfony 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1623 bằng cách chạy lệnh này. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1624 Tự động tìm nạp đối tượng (Entity ValueResolver)6. 2 Entity Value Resolver được giới thiệu trong Symfony 6. 2 2. 7. 1 Autowiring của 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1625 đã được giới thiệu trong DoctrineBundle 2. 7. 1 Trong nhiều trường hợp, bạn có thể sử dụng 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1625 để tự động thực hiện truy vấn cho mình. Bạn có thể đơn giản hóa bộ điều khiển để 1 292____193 Đó là nó. Gói sử dụng 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1627 từ tuyến đường để truy vấn cho 66 theo cột 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1629. Nếu không tìm thấy, một trang 404 sẽ được tạo Hành vi này được bật theo mặc định trên tất cả các bộ điều khiển của bạn. Bạn có thể tắt nó bằng cách đặt tùy chọn cấu hình 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1630 thành 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1631 Khi bị tắt, bạn có thể bật riêng lẻ trên bộ điều khiển mong muốn bằng cách sử dụng thuộc tính 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1632 81 295 Mẹo Khi được bật trên toàn cầu, có thể tắt hành vi trên một bộ điều khiển cụ thể bằng cách sử dụng 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1632 được đặt thành 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1634 chức năng công khai hiển thị (# [Người dùng hiện tại] # [MapEntity (đã tắt. true)] Người dùng $user). Phản hồi { // Người dùng không được giải quyết bởi EntityValueResolver // Tìm nạp tự độngNếu các ký tự đại diện tuyến đường của bạn khớp với các thuộc tính trên thực thể của bạn, thì trình phân giải sẽ tự động tìm nạp chúng 1 296 1 297 Tìm nạp tự động hoạt động trong những trường hợp này
Bạn có thể kiểm soát hành vi này bằng cách thêm thuộc tính 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1632 và sử dụng các tùy chọn MapEntity Tìm nạp qua một Biểu thứcNếu tính năng tìm nạp tự động không hoạt động, bạn có thể viết một biểu thức bằng cách sử dụng thành phần Ngôn ngữ biểu thức 1 298 1 299 Trong biểu thức, biến 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1639 sẽ là lớp Kho lưu trữ của thực thể của bạn và bất kỳ ký tự đại diện tuyến đường nào - như 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1640 đều có sẵn dưới dạng biến Điều này cũng có thể được sử dụng để giúp giải quyết nhiều đối số 00 01Trong ví dụ trên, đối số 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1605 được xử lý tự động, nhưng 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1642 được định cấu hình với thuộc tính vì cả hai không thể tuân theo quy ước mặc định Tùy chọn MapEntityMột số tùy chọn có sẵn trên chú thích 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1632 để kiểm soát hành vi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1629 Nếu tùy chọn 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1629 được định cấu hình và khớp với tham số tuyến đường, thì trình phân giải sẽ tìm thấy khóa chính 00 031 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1646 Định cấu hình các thuộc tính và giá trị để sử dụng với phương thức 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1637. khóa là tên trình giữ chỗ tuyến đường và giá trị là tên thuộc tính Doctrine 04 051 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1648 Định cấu hình các thuộc tính sẽ được sử dụng trong phương thức 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1637 bằng cách loại trừ một hoặc nhiều thuộc tính để không phải tất cả đều được sử dụng
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1650Nếu đúng, thì khi sử dụng 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1637, bất kỳ giá trị nào là 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1616 sẽ không được sử dụng cho truy vấn. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1653 Theo mặc định, 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1625 sử dụng trình quản lý thực thể mặc định nhưng bạn có thể định cấu hình 1 298 071 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1655Nếu đúng, buộc Doctrine luôn tìm nạp thực thể từ cơ sở dữ liệu thay vì bộ đệm. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1634Nếu đúng, thì 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1625 sẽ không cố gắng thay thế đối số Cập nhật một đối tượngKhi bạn đã tìm nạp một đối tượng từ Doctrine, bạn tương tác với nó giống như với bất kỳ mô hình PHP nào 08 09Sử dụng Doctrine để chỉnh sửa một sản phẩm hiện có bao gồm ba bước
Bạn có thể gọi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1659, nhưng không cần thiết. Doctrine đã "theo dõi" đối tượng của bạn để thay đổi Xóa một đối tượngXóa một đối tượng rất giống nhau, nhưng yêu cầu gọi phương thức 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1660 của trình quản lý thực thể 1 2 61Như bạn có thể mong đợi, phương thức 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1660 thông báo cho Doctrine rằng bạn muốn xóa đối tượng đã cho khỏi cơ sở dữ liệu. Truy vấn 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1662 không thực sự được thực thi cho đến khi phương thức 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1608 được gọi Truy vấn đối tượng. Kho lưu trữBạn đã thấy cách đối tượng kho lưu trữ cho phép bạn chạy các truy vấn cơ bản mà không cần thực hiện bất kỳ thao tác nào 62 63Nhưng nếu bạn cần một truy vấn phức tạp hơn thì sao? 64____265Khi bạn tìm nạp kho lưu trữ của mình (tôi. e. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1666), nó thực sự là một thể hiện của đối tượng này. Điều này là do cấu hình 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1667 đã được tạo ở đầu lớp thực thể 66 của bạnGiả sử bạn muốn truy vấn tất cả các đối tượng Sản phẩm lớn hơn một mức giá nhất định. Thêm một phương pháp mới cho điều này vào kho lưu trữ của bạn 6 67Chuỗi được chuyển đến 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1669 có thể trông giống như SQL, nhưng đó là Ngôn ngữ truy vấn Doctrine. Điều này cho phép bạn nhập các truy vấn bằng cách sử dụng ngôn ngữ truy vấn phổ biến, nhưng thay vào đó tham chiếu các đối tượng PHP (i. e. trong câu lệnh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1670) Bây giờ, bạn có thể gọi phương thức này trên kho lưu trữ 1 298 69Xem Bộ chứa dịch vụ để biết cách đưa kho lưu trữ vào bất kỳ dịch vụ nào Truy vấn bằng Trình tạo truy vấnDoctrine cũng cung cấp Trình tạo truy vấn, một cách hướng đối tượng để viết truy vấn. Bạn nên sử dụng điều này khi các truy vấn được xây dựng động (i. e. dựa trên điều kiện PHP) 70 71Truy vấn với SQLNgoài ra, bạn có thể truy vấn trực tiếp bằng SQL nếu cần 1 290____273 Với SQL, bạn sẽ lấy lại dữ liệu thô chứ không phải đối tượng (trừ khi bạn sử dụng chức năng NativeQuery) Cấu hìnhXem tài liệu tham khảo cấu hình Doctrine Mối quan hệ và hiệp hộiDoctrine cung cấp tất cả các chức năng bạn cần để quản lý các mối quan hệ cơ sở dữ liệu (còn được gọi là các liên kết), bao gồm các mối quan hệ ManyToOne, OneToMany, OneToOne và ManyToMany Để biết thông tin, hãy xem Cách làm việc với các Hiệp hội / Mối quan hệ Học thuyết Kiểm tra cơ sở dữ liệuĐọc bài viết về test code tương tác với cơ sở dữ liệu Phần mở rộng của Doctrine (Dấu thời gian, Có thể dịch, v.v. )Cộng đồng Doctrine đã tạo một số tiện ích mở rộng để thực hiện các nhu cầu phổ biến, chẳng hạn như "tự động đặt giá trị của thuộc tính createdAt khi tạo thực thể". Đọc thêm về các tiện ích mở rộng Doctrine có sẵn và sử dụng StofDoctrineExtensionsBundle để tích hợp chúng vào ứng dụng của bạn |