Không, không có cách nào để lập trình cấu trúc truy vấn con bằng cách sử dụng CDbCriteria và CActiveRecord của Yii. Nó không giống như Query Builder có một cách, một trong hai.
Bạn vẫn có thể làm subqueries một vài cách khác nhau, tuy nhiên:
$results = Object1::model()->findAll(array(
'condition'=>'t.field1 in (select table2.field2 from table2)')
);
Bạn cũng có thể làm một tham gia (mà có lẽ sẽ nhanh hơn, truy vấn con có thể được làm chậm):
$results = Object1::model()->findAll(array(
'join'=>'JOIN table2 ON t.field1 = table2.field2'
);
Bạn cũng có thể thực hiện truy vấn SQL trực tiếp với findAllBySql:
$results = Object1::model()->findAllBySql('
select * from table1 where table1.field1 in
(select table2.field2 from table2)'
);
Bạn có thể, tuy nhiên, tại le ast cung cấp một giao diện phong cách AR tốt đẹp để những như vậy:
class MyModel extends CActiveRecord {
public function getResults() {
return Object1::model()->findAll(array(
'condition'=>'t.field1 in (select table2.field2 from table2)')
);
}
}
gọi như vậy:
$model = new MyModel();
$results = $model->results;
Một ý tưởng thay thế thú vị sẽ được tạo subquery của bạn bằng cách sử dụng xe cộ và Query CDbCommand hay một cái gì đó, và sau đó chỉ cần vượt qua chuỗi truy vấn SQL kết quả vào một CDbCritera addInCondition()
? Bạn không chắc chắn nếu điều này sẽ làm việc, nhưng nó có thể:
$sql = Yii::app()->db->createCommand()
->select('*')
->from('tbl_user')
->text;
$criteria->addInCondition('columnName',$sql);
Bạn luôn có thể mở rộng các lớp CDbCriteria cơ sở để xử lý và xây dựng các truy vấn con bằng cách nào đó là tốt. Có thể làm cho một phần mở rộng tốt đẹp, bạn có thể phát hành! :)
Tôi hy vọng điều đó sẽ hữu ích!
Cảm ơn thaddeusmt, đây là một ví dụ duy nhất, truy vấn của tôi thậm chí còn phức tạp hơn, và nó không thể làm điều đó với tham gia, và tôi muốn làm điều đó bằng kỷ lục hoạt động, tôi sẽ muốn biết nếu có một cách trong Yii để xây dựng các truy vấn phụ mà không sử dụng SQL? – Youcef04
Đó là khá nhiều lựa chọn của bạn. Tất cả ba đối tượng CActiveRecord trả về, tôi tin rằng, vì vậy bạn vẫn đang sử dụng AR. Bạn có thể sử dụng AR "phạm vi" để bọc các truy vấn và cung cấp một API tốt đẹp cho các đối tượng AR của bạn, là tốt. Vì dường như câu hỏi bạn hỏi không phải là câu hỏi * thực tế * của bạn, có lẽ bạn có thể chỉnh sửa nó? Hoặc hỏi một cái mới? Vì vậy, trả lời nó là có thể? – thaddeusmt
tùy chọn đầu tiên là giải pháp của tôi, rõ ràng là tôi đang tìm kiếm giải pháp khác, tùy chọn thứ hai sử dụng kết nối, không thể giúp tôi, thứ ba không thú vị. tôi đã chỉnh sửa câu hỏi, và tôi hy vọng nó rõ ràng hơn bây giờ? – Youcef04