Đoạn mã trên sẽ lấy một nhân viên có tên kiran và mức lương 25000. Nếu nhiều nhân viên thỏa mãn điều kiện trên, lệnh gọi one[] đảm bảo rằng chỉ kết quả đầu tiên được tìm nạp. Để tìm nạp tất cả các kết quả, bạn nên sử dụng all[]
Lưu ý rằng nếu bạn sử dụng all[] thì kết quả sẽ luôn là một mảng; . Mảng này chứa tất cả kết quả dưới dạng mảng hoặc trống khi không có bản ghi nào khớp. Cuộc gọi one[] sẽ trả về mảng kết quả trực tiếp hoặc sai nếu truy vấn không trả về bất cứ thứ gì
Mã tương đương trong sql được đưa ra dưới đây
select emp_name, emp_salary from employee where emp_name = 'Kiran' and emp_salary = 25000 limit 1;
Dưới đây là một cách khác để viết truy vấn trên trong Yii2
$rows = $query->select[['emp_name', 'emp_salary']]
->from['employee']
->where[['emp_name' => 'Kiran']]
->andWhere[['emp_salary' => 25000]]
->one[];
Tập hợp các điều kiện bổ sung có thể được chỉ định bằng cách sử dụng andWhere. Điều này sẽ hữu ích nếu sau này chúng ta cần thêm kiểm tra điều kiện vào truy vấn
Tuy nhiên, một cách khác để chỉ định nhiều điều kiện là sử dụng định dạng toán tử của phương thức where[]. Truy vấn trên cũng có thể được viết như dưới đây
$rows = $query->select[['emp_name','emp_salary']]
->from['employee']
->where[['and', 'emp_name="kiran"', 'emp_salary=25000']]
->one[];
Ở đây chúng tôi chỉ định toán tử 'và' là phần tử đầu tiên trong mảng. Tương tự, chúng ta cũng có thể sử dụng 'or', 'between', 'not between', 'in', 'not in', 'like', 'or like', 'not like', 'or not like', 'exists'
Ví dụ về việc sử dụng 'in' và 'like'
Giả sử chúng ta cần tìm những nhân viên có mức lương 20000, 25000 và 50000. Trong sql bình thường, chúng tôi sẽ viết truy vấn dưới dạng
select * from employee where salary in [20000,25000,50000]
Trong Yii2, chúng ta có thể viết cái này như dưới đây
$rows = $query->from['employee']
->where[['emp_salary' => [20000,25000,50000]]]
->all[];
Một cách khác để xác định điều kiện tương tự là
$rows = $query->from['employee']
->where[['in', 'emp_salary', [20000,25000,50000]]] // Making use of operator format of where[] method
->all[];
Tương tự, 'not in' có thể được chỉ định thay vì 'in' nếu chúng ta muốn nhận tất cả nhân viên không có lương 20000, 25000 và 50000
Bây giờ chúng ta hãy xem một số ví dụ về việc sử dụng 'like' bên trong điều kiện where[]. Giả sử chúng ta cần tìm tất cả nhân viên có chuỗi 'gopal' trong tên của họ. Các tên có thể là venugopal, rajagopal, gopalakrishnan, v.v. Truy vấn sql được đưa ra dưới đây
select * from employee where emp_name like '%gopal%'
Trong Yii2, chúng ta sẽ viết cái này dưới dạng
$rows = $query->from['employee']
->where[['like', 'emp_name', 'gopal']] // Making use of operator format of where[] method
->all[];
Nếu chúng ta cần tìm tất cả nhân viên có chuỗi 'gopal' và 'nair' trong tên của họ. Chúng ta có thể viết như
________số 8_______Điều này sẽ đánh giá là
chọn * từ nhân viên nơi emp_name như '%gopal%' và '%nair%'
Tương tự, chúng ta có thể sử dụng 'not like' để biểu thị tất cả nhân viên không có chuỗi 'gopal' và 'nair' trong tên của họ
Có hai loại liên kết giữa các bảng trong yii2. chúng được sử dụng để xác định mối liên hệ giữa hai mô hình
Một đến nhiều. đã thắng
một đối một. có một
Kết quả trả về. kết quả trả về của cả hai phương thức là các đối tượng yii \ db \ ActiveQuery
Tham số đầu tiên là tên lớp của mô hình được liên kết
Tham số thứ hai là một mảng. Khóa là thuộc tính trong mô hình được liên kết và giá trị là thuộc tính trong mô hình hiện tại
sử dụng liên quan
Bây giờ chúng tôi nhận được tất cả các thông tin đặt hàng của một khách hàng
// Obtain a customer information $ Customer = customer: findOne [1]; $ orders = $ customer-> orders; // getOrders [] is used to obtain all orders of the Customer.
Hai dòng mã trên tạo ra câu lệnh SQL sau
SELECT * FROM customer WHERE id=1;SELECT * FROM order WHERE customer_id=1;
Bộ đệm kết quả liên kết
Nếu thứ tự của khách hàng thay đổi, chúng tôi có thể gọi lại
$orders = $customer->orders;
Khi bạn nhận được đơn đặt hàng một lần nữa, bạn sẽ thấy rằng không có thay đổi. Lý do là cơ sở dữ liệu sẽ chỉ được truy vấn khi $customer->orders được thực hiện lần đầu tiên và kết quả sẽ được lưu vào bộ đệm. câu lệnh SQL sẽ không được thực hiện trong các truy vấn trong tương lai
Vậy nếu tôi muốn thực thi lại SQL thì sao?
unset[$customer->orders];$customer->orders;
Sau đó, bạn có thể lấy dữ liệu từ cơ sở dữ liệu
Xác định nhiều hiệp hội
Tương tự, chúng ta cũng có thể định nghĩa nhiều liên kết trong Khách hàng
Ví dụ đơn hàng có tổng số lớn hơn 100 bị trả về
class Customer extends \yii\db\ActiveRecord{public function getBigOrders[$threshold = 100]{return $this->hasMany[Order::className[], ['customer_id' => 'id']]->where['subtotal > :threshold', [':threshold' => $threshold]]->orderBy['id'];}}
Hai phương pháp truy cập được liên kết
Nếu bạn dùng
$customer->bigOrders
Bạn sẽ nhận được hơn 100 đơn đặt hàng. Nếu bạn muốn trả lại đơn hàng lớn hơn 200, bạn có thể viết nó như thế này
Class Order extends \ yii \ db \ ActiveRecord {// Obtain the public function getCustomer [] of the Order User [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasOne [Customer: className [], ['id' => 'customer _ id']];} // Obtain all books in the order public function getBooks [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasexample [Book: className [], ['id' => 'Book _ id']];}0
Chúng ta có thể thấy ở trên rằng có hai cách để truy cập một hiệp hội
Nếu bạn gọi một hàm, một đối tượng ActiveQuery [$customer->getOrders[]->all[] được trả về[]]
Nếu bạn gọi một thuộc tính, kết quả mô hình [$customer->orders] sẽ được trả về trực tiếp]
Xem đoạn mã sau để sử dụng
Class Order extends \ yii \ db \ ActiveRecord {// Obtain the public function getCustomer [] of the Order User [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasOne [Customer: className [], ['id' => 'customer _ id']];} // Obtain all books in the order public function getBooks [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasexample [Book: className [], ['id' => 'Book _ id']];}1
Nếu chúng tôi cần truy xuất 100 người dùng và sau đó truy cập vào đơn đặt hàng của từng người dùng, chúng tôi có thể viết đoạn mã sau từ trên
Class Order extends \ yii \ db \ ActiveRecord {// Obtain the public function getCustomer [] of the Order User [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasOne [Customer: className [], ['id' => 'customer _ id']];} // Obtain all books in the order public function getBooks [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasexample [Book: className [], ['id' => 'Book _ id']];}2
Tuy nhiên, nếu trường hợp này xảy ra, một câu lệnh SQL được thực thi trong mỗi vòng lặp của foreach để truy vấn dữ liệu trong cơ sở dữ liệu. Bởi vì mỗi đối tượng $customer đều khác nhau
Để giải quyết vấn đề trên, bạn có thể sử dụng yii\db\ActiveQuery. []
Tham số chiều rộng là tên của liên kết, nghĩa là getOrders được xác định trong mô hình, đơn đặt hàng và khách hàng trong getCustomer
Class Order extends \ yii \ db \ ActiveRecord {// Obtain the public function getCustomer [] of the Order User [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasOne [Customer: className [], ['id' => 'customer _ id']];} // Obtain all books in the order public function getBooks [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasexample [Book: className [], ['id' => 'Book _ id']];}3
Nếu lựa chọn được sử dụng để chỉ định các cột được trả về, hãy đảm bảo rằng các cột được trả về chứa các trường tương quan của Mô hình được liên kết. Nếu không, Mô hình của bảng được liên kết sẽ không được trả lại
Class Order extends \ yii \ db \ ActiveRecord {// Obtain the public function getCustomer [] of the Order User [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasOne [Customer: className [], ['id' => 'customer _ id']];} // Obtain all books in the order public function getBooks [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasexample [Book: className [], ['id' => 'Book _ id']];}4
Áp dụng điều kiện lọc cho
Truy vấn đơn đặt hàng với một khách hàng lớn hơn 100
Class Order extends \ yii \ db \ ActiveRecord {// Obtain the public function getCustomer [] of the Order User [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasOne [Customer: className [], ['id' => 'customer _ id']];} // Obtain all books in the order public function getBooks [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasexample [Book: className [], ['id' => 'Book _ id']];}5
Truy vấn đơn hàng của hơn 100 khách hàng
Class Order extends \ yii \ db \ ActiveRecord {// Obtain the public function getCustomer [] of the Order User [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasOne [Customer: className [], ['id' => 'customer _ id']];} // Obtain all books in the order public function getBooks [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasexample [Book: className [], ['id' => 'Book _ id']];}6
Ở đây, tham số chiều rộng là một mảng, khóa là tên được liên kết và giá trị là hàm gọi lại
Điều đó có nghĩa là, thực hiện $ query-> andWhere ['subtotal> 100'] cho ActiveQuery được trả về bởi Hiệp hội đơn đặt hàng '];
Sử dụng joinWith cho Hiệp hội bảng
Chúng ta đều biết rằng tham gia có thể được sử dụng để viết liên kết giữa nhiều bảng. Hãy xem câu lệnh joinWit trong yii2
Class Order extends \ yii \ db \ ActiveRecord {// Obtain the public function getCustomer [] of the Order User [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasOne [Customer: className [], ['id' => 'customer _ id']];} // Obtain all books in the order public function getBooks [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasexample [Book: className [], ['id' => 'Book _ id']];}7
$ Với là một chuỗi hoặc mảng. nếu nó là một chuỗi, nó là tên của Hiệp hội được xác định trong mô hình [có thể là một hiệp hội con]
Nếu đó là một mảng, khóa là liên kết được xác định ở định dạng getXXX của mô hình và giá trị là thao tác gọi lại tiếp theo cho liên kết này
$ háo hức đang tải. có tải dữ liệu của mô hình được liên kết với $
$ JoinType. loại THAM GIA. giá trị có sẵn. tham gia bên trái và tham gia bên trong. giá trị mặc định là trái tham gia
Class Order extends \ yii \ db \ ActiveRecord {// Obtain the public function getCustomer [] of the Order User [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasOne [Customer: className [], ['id' => 'customer _ id']];} // Obtain all books in the order public function getBooks [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasexample [Book: className [], ['id' => 'Book _ id']];}8
Về mặt triển khai, trước tiên Yii thực thi câu lệnh SQL đáp ứng các điều kiện truy vấn THAM GIA, điền kết quả vào mô hình chính, sau đó thực thi một câu lệnh truy vấn cho mỗi THAM GIA và điền vào mô hình liên kết tương ứng
Class Order extends \ yii \ db \ ActiveRecord {// Obtain the public function getCustomer [] of the Order User [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasOne [Customer: className [], ['id' => 'customer _ id']];} // Obtain all books in the order public function getBooks [] {// specify the associated sub-table model class name as the first parameter // return $ this-> hasexample [Book: className [], ['id' => 'Book _ id']];}9
với điều kiện
Bạn cũng có thể chỉ định điều kiện khi xác định liên kết
Class Book extends \ yii \ db \ ActiveRecord {// Obtain the author's public function getAuthor [] {// similarly, the first parameter specifies the name of the associated sub-table model class return $ this-> hasOne [Author: className [], ['id' => 'author _ id']];}0
Sử dụng trong tham giaWith
Class Book extends \ yii \ db \ ActiveRecord {// Obtain the author's public function getAuthor [] {// similarly, the first parameter specifies the name of the associated sub-table model class return $ this-> hasOne [Author: className [], ['id' => 'author _ id']];}1
Nếu thao tác nối không được sử dụng, với được sử dụng hoặc liên kết được truy cập trực tiếp bằng các thuộc tính. Trong trường hợp này, điều kiện on được sử dụng như điều kiện where
Class Book extends \ yii \ db \ ActiveRecord {// Obtain the author's public function getAuthor [] {// similarly, the first parameter specifies the name of the associated sub-table model class return $ this-> hasOne [Author: className [], ['id' => 'author _ id']];}2
Tóm lược
Đầu tiên, xác định liên kết trong mô hình [ví dụ: Đơn hàng trong getOrders là một liên kết]
Sau đó, sử dụng các liên kết được xác định trong mô hình trong with hoặc joinWith
Bạn cũng có thể chỉ định phương thức gọi lại khi sử dụng Hiệp hội
Sau đó, bạn có thể chỉ định vị trí hoặc điều kiện cho liên kết, với và tham giaVới
Trên thực tế, phần này hơi lộn xộn và một số tính năng chưa được hoàn thành, chẳng hạn như ba liên kết bảng và liên kết nghịch đảo
Đây là những thao tác cơ bản nhất. Nếu bạn muốn biết thêm, bạn có thể trả lời
Phần trên mô tả về tham gia và tham gia cùng với kiến thức về truy vấn tham gia nhiều bảng trong Yii2. Tôi hy vọng sẽ giúp bạn. Nếu có thắc mắc vui lòng để lại lời nhắn, biên tập viên sẽ trả lời bạn kịp thời. Tôi muốn cảm ơn bạn đã hỗ trợ cho PHP chinnet
Để biết thêm các bài viết về cách sử dụng tham gia và tham gia với các truy vấn tham gia nhiều bảng trong Yii2, vui lòng theo dõi mạng PHP Trung Quốc