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

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

  • Bài viết này giải thích cách khuyến nghị để làm việc với cơ sở dữ liệu quan hệ trong các ứng dụng Symfony;
  • Đọc bài viết khác này nếu bạn cần quyền truy cập cấp thấp để thực hiện các truy vấn SQL thô tới cơ sở dữ liệu quan hệ (tương tự như PDO của PHP);
  • Đọc tài liệu DoctrineMongoDBBundle nếu bạn đang làm việc với cơ sở dữ liệu MongoDB

Cài đặt Doctrine

Đầu tiên, cài đặt hỗ trợ Doctrine qua gói Symfony

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
48, cũng như MakerBundle, gói này sẽ giúp tạo một số mã

1
2
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle

Cấu hình cơ sở dữ liệu

Thô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à

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
49. Để phát triển, bạn có thể tìm và tùy chỉnh cái này bên trong
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
50

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# .env (or override DATABASE_URL in .env.local to avoid committing your changes)

# customize this line!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7"

# to use mariadb:
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=mariadb-10.5.8"

# to use sqlite:
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"

# to use postgresql:
# DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"

# to use oracle:
# DATABASE_URL="oci8://db_user:[email protected]:1521/db_name"

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ư

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
51,
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
52,
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
53,
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
54,
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
55,
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
56,
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
57,
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
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ố
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
59 trong
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
60 để tránh sai sót.
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
61

Bâ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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
62 cho bạn

1
2
9
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
0

Có nhiều tùy chọn hơn trong

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
60 mà bạn có thể định cấu hình, bao gồm cả
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
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 động

Mẹo

Còn nhiều lệnh Doctrine khác. Chạy

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
66 để đại diện cho những sản phẩm đó

Bạn có thể sử dụng lệnh

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
6
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
7

Ái chà. Bây giờ bạn có một tệp

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
68 mới

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
9
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
0

Ghi 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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
69 vào thuộc tính
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
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
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
72 và
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
73 phải đặt giá trị tối đa của nó là
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
74 thành
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
76 trong cơ sở dữ liệu của mình. Mỗi thuộc tính trong thực thể
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
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
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
78 mà bạn nhìn thấy trên mỗi tài sản

Postgresql thay thế các thực thể html

Lệnh

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
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ình

Doctrine 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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
80 và
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
81 vào ánh xạ thực thể trong tệp
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
60 của bạn

thậ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.

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
83 hoặc
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
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
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
85 phía trên lớp hoặc định cấu hình tên cột bằng tùy chọn
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
86

di cư. Tạo các bảng/lược đồ cơ sở dữ liệu

Lớp

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
66 đã được định cấu hình đầy đủ và sẵn sàng lưu vào bảng
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
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
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
76. Để thêm nó, bạn có thể tận dụng DoctrineMigrationsBundle đã được cài đặt

1
2
9
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
1

Nếu mọi thứ hoạt động, bạn sẽ thấy một cái gì đó như thế này

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
2____03

Nế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
2
9
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
5

Lệ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ơn

Nhưng nếu bạn cần thêm thuộc tính trường mới vào

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
66, chẳng hạn như
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
70 thì sao? . Tuy nhiên, bạn cũng có thể sử dụng lại
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
67

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
6
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
7

Điều này thêm thuộc tính

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
70 mới và các phương thức
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
94 và
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
95

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
8
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
9

Thuộc tính mới được ánh xạ, nhưng nó chưa tồn tại trong bảng

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
76. Không vấn đề gì. Tạo một di chuyển mới

1
2
9
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
1

Lần này, SQL trong tệp được tạo sẽ trông như thế này

1
2
9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
3

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
2
9
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
5

Thao 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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
97 để theo dõi điều này

Mỗ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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
67 có thể tạo các phương thức getter & setter cho bạn

1
2
9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
7

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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
99

Cá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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
66 vào cơ sở dữ liệu. Hãy tạo một bộ điều khiển mới để thử nghiệm

1
2
9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
9

Bên trong bộ điều khiển, bạn có thể tạo một đối tượng

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
66 mới, thiết lập dữ liệu trên đó và lưu nó

# .env (or override DATABASE_URL in .env.local to avoid committing your changes)

# customize this line!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7"

# to use mariadb:
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=mariadb-10.5.8"

# to use sqlite:
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"

# to use postgresql:
# DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"

# to use oracle:
# DATABASE_URL="oci8://db_user:[email protected]:1521/db_name"
0
# .env (or override DATABASE_URL in .env.local to avoid committing your changes)

# customize this line!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7"

# to use mariadb:
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=mariadb-10.5.8"

# to use sqlite:
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"

# to use postgresql:
# DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"

# to use oracle:
# DATABASE_URL="oci8://db_user:[email protected]:1521/db_name"
1

dùng thử

http. //máy chủ cục bộ. 8000/sản phẩm

Xin chúc mừng. Bạn vừa tạo hàng đầu tiên của mình trong bảng

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
76. Để chứng minh điều đó, bạn có thể truy vấn trực tiếp cơ sở dữ liệu

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
2
# .env (or override DATABASE_URL in .env.local to avoid committing your changes)

# customize this line!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7"

# to use mariadb:
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=mariadb-10.5.8"

# to use sqlite:
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"

# to use postgresql:
# DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"

# to use oracle:
# DATABASE_URL="oci8://db_user:[email protected]:1521/db_name"
3

Hãy xem ví dụ trước chi tiết hơn

  • dòng 13 Đối số
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    03 yêu cầu Symfony đưa dịch vụ Doctrine vào phương thức của bộ điều khiển
  • dòng 15 Phương thức
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    04 lấy đối tượng Doctrine entitymanager, đây là đối tượng quan trọng nhất trong Doctrine. Nó chịu trách nhiệm lưu các đối tượng vào và tìm nạp các đối tượng từ cơ sở dữ liệu
  • dòng 17-20 Trong phần này, bạn khởi tạo và làm việc với đối tượng
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    05 giống như bất kỳ đối tượng PHP thông thường nào khác
  • dòng 23 Cuộc gọi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    06 yêu cầu Doctrine "quản lý" đối tượng
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    05. Điều này không khiến truy vấn được thực hiện đối với cơ sở dữ liệu
  • dòng 26 Khi phương thức
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    08 được gọi, Doctrine sẽ xem qua tất cả các đối tượng mà nó đang quản lý để xem liệu chúng có cần được duy trì trong cơ sở dữ liệu hay không. Trong ví dụ này, dữ liệu của đối tượng
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    05 không tồn tại trong cơ sở dữ liệu, vì vậy trình quản lý thực thể thực hiện truy vấn
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    10, tạo một hàng mới trong bảng
    $ composer require symfony/orm-pack
    $ composer require --dev symfony/maker-bundle
    76

Ghi chú

Nếu cuộc gọi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
08 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
16
13 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ượng

Trì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

# .env (or override DATABASE_URL in .env.local to avoid committing your changes)

# customize this line!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7"

# to use mariadb:
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=mariadb-10.5.8"

# to use sqlite:
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"

# to use postgresql:
# DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"

# to use oracle:
# DATABASE_URL="oci8://db_user:[email protected]:1521/db_name"
0
# .env (or override DATABASE_URL in .env.local to avoid committing your changes)

# customize this line!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7"

# to use mariadb:
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=mariadb-10.5.8"

# to use sqlite:
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"

# to use postgresql:
# DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"

# to use oracle:
# DATABASE_URL="oci8://db_user:[email protected]:1521/db_name"
5

Mặc dù thực thể

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
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
16
15 không thể là
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
16 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
16
17NotNullYê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
16
18TypeYêu cầu cài đặt thành phần PropertyInfo
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
73UniqueEntity
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
74Length

Vì 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ệu

Tì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
16
21 để xem sản phẩm mới của mình

# .env (or override DATABASE_URL in .env.local to avoid committing your changes)

# customize this line!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7"

# to use mariadb:
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=mariadb-10.5.8"

# to use sqlite:
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"

# to use postgresql:
# DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"

# to use oracle:
# DATABASE_URL="oci8://db_user:[email protected]:1521/db_name"
6
# .env (or override DATABASE_URL in .env.local to avoid committing your changes)

# customize this line!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7"

# to use mariadb:
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=mariadb-10.5.8"

# to use sqlite:
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"

# to use postgresql:
# DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"

# to use oracle:
# DATABASE_URL="oci8://db_user:[email protected]:1521/db_name"
7

Mộ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
16
22 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

# .env (or override DATABASE_URL in .env.local to avoid committing your changes)

# customize this line!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7"

# to use mariadb:
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=mariadb-10.5.8"

# to use sqlite:
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"

# to use postgresql:
# DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"

# to use oracle:
# DATABASE_URL="oci8://db_user:[email protected]:1521/db_name"
8
# .env (or override DATABASE_URL in .env.local to avoid committing your changes)

# customize this line!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7"

# to use mariadb:
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=mariadb-10.5.8"

# to use sqlite:
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"

# to use postgresql:
# DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"

# to use oracle:
# DATABASE_URL="oci8://db_user:[email protected]:1521/db_name"
9

dùng thử

http. //máy chủ cục bộ. 8000/sản phẩm/1

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
2
90
1
2
91

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

Postgresql thay thế các thực thể html

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
16
23 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
16
24

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
16
25 đã đượ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
16
25 để 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
2
92____193

Đó là nó. Gói sử dụng

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
27 từ tuyến đường để truy vấn cho
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
66 theo cột
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
29. 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
16
30 thành
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
31

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
16
32

# .env (or override DATABASE_URL in .env.local to avoid committing your changes)

# customize this line!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7"

# to use mariadb:
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=mariadb-10.5.8"

# to use sqlite:
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"

# to use postgresql:
# DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"

# to use oracle:
# DATABASE_URL="oci8://db_user:[email protected]:1521/db_name"
8
1
2
95

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
16
32 được đặt thành
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
34

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ự động

Nế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
2
96
1
2
97

Tìm nạp tự động hoạt động trong những trường hợp này

  • Nếu
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    27 nằm trong lộ trình của bạn, thì điều này được sử dụng để tìm nạp bằng khóa chính thông qua phương thức
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    36
  • Trình phân giải sẽ cố gắng thực hiện tìm nạp
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    37 bằng cách sử dụng tất cả các ký tự đại diện trong tuyến đường thực sự là thuộc tính trên thực thể của bạn (không phải thuộc tính bị bỏ qua)

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
16
32 và sử dụng các tùy chọn MapEntity

Tìm nạp qua một Biểu thức

Nế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
2
98
1
2
99

Trong biểu thức, biến

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
39 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
16
40 đề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ố

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
00
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
01

Trong ví dụ trên, đối số

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
05 được xử lý tự động, nhưng
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
42 đượ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 MapEntity

Mộ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
16
32 để kiểm soát hành vi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
29

Nếu tùy chọn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
29 đượ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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
00
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
03

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
46

Đị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
16
37. khóa là tên trình giữ chỗ tuyến đường và giá trị là tên thuộc tính Doctrine

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
04
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
05

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
48

Đị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
16
37 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

#[Route('/product/{slug}/{date}')] chức năng công cộng hiển thị( #[MapEntity(exclude. ['date'])] Sản phẩm $product DateTime $date ). Phản ứng { }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
50Nếu đúng, thì khi sử dụng
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
37, bất kỳ giá trị nào là
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
16 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
16
53

Theo mặc định,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
25 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
2
98
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
07

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
55Nế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
16
34Nếu đúng, thì
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
25 sẽ không cố gắng thay thế đối số

Cập nhật một đối tượng

Khi 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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
08
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
09

Sử dụng Doctrine để chỉnh sửa một sản phẩm hiện có bao gồm ba bước

  1. tìm nạp đối tượng từ Doctrine;
  2. sửa đổi đối tượng;
  3. gọi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    08 trên người quản lý thực thể

Bạn có thể gọi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
59, 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ượng

Xó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
16
60 của trình quản lý thực thể

1
2
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
61

Như 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
16
60 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
16
62 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
16
08 đượ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

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
62
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
63

Nhưng nếu bạn cần một truy vấn phức tạp hơn thì sao?

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
64____265

Khi 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
16
66), 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
16
67 đã được tạo ở đầu lớp thực thể
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
66 của bạn

Giả 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

# .env (or override DATABASE_URL in .env.local to avoid committing your changes)

# customize this line!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7"

# to use mariadb:
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=mariadb-10.5.8"

# to use sqlite:
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"

# to use postgresql:
# DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"

# to use oracle:
# DATABASE_URL="oci8://db_user:[email protected]:1521/db_name"
6
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
67

Chuỗi được chuyển đến

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
69 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
16
70)

Bây giờ, bạn có thể gọi phương thức này trên kho lưu trữ

1
2
98
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
69

Xem 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ấn

Doctrine 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)

$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
70
$ composer require symfony/orm-pack
$ composer require --dev symfony/maker-bundle
71

Truy vấn với SQL

Ngoài ra, bạn có thể truy vấn trực tiếp bằng SQL nếu cần

1
2
90____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ình

Xem tài liệu tham khảo cấu hình Doctrine

Mối quan hệ và hiệp hội

Doctrine 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