Yii2 tham gia truy vấn với điều kiện ở đâu

Đ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

Làm cách nào để sử dụng phép nối bên trong SQL với điều kiện WHERE?

Để sử dụng mệnh đề WHERE nhằm thực hiện phép nối giống như khi bạn thực hiện bằng cú pháp INNER JOIN, hãy nhập cả điều kiện nối và điều kiện lựa chọn bổ sung vào mệnh đề WHERE. The tables to be joined are listed in the FROM clause, separated by commas. This query returns the same output as the previous example.

Làm cách nào để nối 3 bảng trong SQL với điều kiện WHERE?

Cách nối 3 bảng trở lên trong SQL .
Tham gia đơn giản. Đầu tiên, tất cả các bảng được nối bằng từ khóa THAM GIA, sau đó mệnh đề WHERE được sử dụng. TỪ Nhân viên e THAM GIA Tiền lương s THAM GIA Bộ phận d. Ở ĐÂU. ID = s. Emp_ID VÀ e. .
Tham gia lồng nhau. Câu lệnh JOIN lồng nhau được sử dụng với từ khóa ON. CHỌN e. ID, e. tên, s. Lương, d

Làm cách nào để sử dụng SubQuery trong Yii2?

Bên cạnh việc tham gia với các bảng, bạn cũng có thể tham gia với các truy vấn con. Để làm như vậy, chỉ định các truy vấn con được tham gia dưới dạng đối tượng yii\db\Query . Ví dụ: $subQuery = [new \yii\db\Query[]]->from['post']; . id = author_id'];

Làm cách nào để tham gia nhiều bảng trong SQL bằng phép nối bên trong?

Cú pháp cho nhiều phép nối. CHỌN cột_tên1,tên_cột2,. TỪ_tên_bảng1 INNER THAM GIA tên_bảng2 BẬT điều kiện_1 INNER THAM GIA tên_bảng3 BẬT điều kiện_2 INNER THAM GIA tên_bảng4 BẬT điều kiện_3 . . . Ghi chú. Trong khi chỉ chọn các cột cụ thể, hãy sử dụng table_name.

Chủ Đề