Tôi đang xem somequestions yêu cầu cách tham gia vào các truy vấn Zend Framework, nhưng câu trả lời luôn là một cái gì đó như "chỉ cần làm setIntegrityCheck(FALSE)
".setIntegrityCheck in Zend Chọn tham gia
Câu hỏi của tôi là: tại sao tôi cần phải làm điều này?
Dường như tôi vô hiệu hóa "kiểm tra tính toàn vẹn" không phải là cách thích hợp để thực hiện công việc này. Trong trường hợp đặc biệt của tôi, tôi đang sử dụng một cơ sở dữ liệu MySQL với một số bảng InnoDB với các phím nước ngoài, vì vậy ví dụ:
CREATE TABLE IF NOT EXISTS `tableA`
(
`id` CHAR(6),
`name` VARCHAR(255),
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `tableB`
(
`tableA_id` CHAR(6),
`somefield` VARCHAR(255),
PRIMARY KEY (`tableA_id`)
) ENGINE=InnoDB;
ALTER TABLE `tableB` ADD FOREIGN KEY fk1 (`tableA_id`) REFERENCES `tableA` (`id`);
(đây là một phiên bản rất đơn giản của DB của tôi)
Và, truy vấn của tôi mã trông như thế này:
$table = new Zend_Db_Table('tableB');
$select = $table->select(TRUE)
->join(array('a' => 'tableA'), 'tableB.tableA_id = a.id');
$result = $table->fetchAll($select);
này đem lại cho tôi "Chọn truy vấn không thể tham gia với một bảng" ngoại lệ, trừ khi tôi thêm setIntegrity(FALSE)
để $select
tôi.
Có tác dụng, nhưng như bạn đã chỉ ra, bạn không thể lấy bất kỳ dữ liệu nào từ các bảng đã nối trong tập kết quả của bạn. Vì dữ liệu vẫn là IS từ bảng chính nên bạn không vi phạm tính toàn vẹn của kết quả, "tất cả dữ liệu của bạn thuộc về bảng chính". Nó rất hữu ích mặc dù nếu bạn muốn chỉ nhận được các hàng có khóa ngoài từ bảng A. Cảm ơn bạn đã chỉ ra điều đó. – drew010
với tính năng kiểm tra tính toàn vẹn bị tắt Tôi có thể truy xuất từ cả bảng chính và bảng đã tham gia. Cảm ơn thông tin @cambraca – Varshaan