2008-11-29 42 views
7

Tôi đang làm việc trên ứng dụng CakePHP 1.2. Tôi có một mô hình "Người dùng" được định nghĩa với một vài mối quan hệ HABTM với các bảng khác thông qua một bảng kết nối.Làm cách nào để truy vấn dữ liệu trong CakePHP bằng các mối quan hệ HABTM?

Tôi hiện được giao nhiệm vụ tìm thông tin Người dùng dựa trên dữ liệu được lưu trữ trong một trong các bảng HABTM này. Thật không may, khi truy vấn thực hiện, điều kiện của tôi bị từ chối với một lỗi về một bảng bị thiếu. Sau khi kiểm tra có vẻ như CakePHP không bao gồm bất kỳ bảng HABTM nào trong câu lệnh chọn.

mối quan hệ HABTM tài khoản của tôi là như sau:

var $hasAndBelongsToMany = array(
    'Course' => array(
     'className'    => 'Course', 
     'joinTable'    => 'course_members', 
     'foreignKey'    => 'user_id', 
     'associationForeignKey' => 'course_id', 
     'conditions'    => '', 
     'order'     => '', 
     'limit'     => '', 
     'uniq'     => false, 
     'finderQuery'   => '', 
     'deleteQuery'   => '', 
     'insertQuery'   => '' 
    ), 
    'School' => array(
     'className'    => 'School', 
     'joinTable'    => 'school_members', 
     'foreignKey'    => 'user_id', 
     'associationForeignKey' => 'school_id', 
     'conditions'    => '', 
     'order'     => '', 
     'limit'     => '', 
     'uniq'     => false, 
     'finderQuery'   => '', 
     'deleteQuery'   => '', 
     'insertQuery'   => '' 
    ), 
    'Team' => array(
     'className'    => 'Team', 
     'joinTable'    => 'team_members', 
     'foreignKey'    => 'user_id', 
     'associationForeignKey' => 'team_id', 
     'conditions'    => '', 
     'order'     => '', 
     'limit'     => '', 
     'uniq'     => false, 
     'finderQuery'   => '', 
     'deleteQuery'   => '', 
     'insertQuery'   => '' 
    ) 
); 

Lỗi này là:

SQL Error: 1054: Unknown column 'School.name' in 'where clause'

Và cuối cùng, các truy vấn nó đang cố gắng để thực hiện

 SELECT 
`User`.`id`, `User`.`username`, `User`.`password`, `User`.`firstName`, `User`.`lastName`, `User`.`email 

`, `User`.`phone`, `User`.`streetAddress`, `User`.`city`, `User`.`province`, `User`.`country`, `User 

`.`postal`, `User`.`userlevel`, `User`.`modified`, `User`.`created`, `User`.`deleted`, `User`.`deleted_date 

` FROM `users` AS `User` WHERE `User`.`id` = 6 AND `School`.`name` LIKE '%Test%' LIMIT 1 

Trả lời

0

FWIW, bạn các bảng tham gia dường như được "đặt tên kỳ lạ" trong phạm vi vì chúng không tuân theo quy ước được mô tả tại đây:

http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM

Trong mọi trường hợp, chúc may mắn, tôi nhớ HABTM là nỗi đau trong CakePHP.

+0

Như tốt nhất như tôi biết điều này nên không quan trọng như Tôi đặt rõ ràng tên bảng và mô hình chung. –

7

Xoay cấp gỡ lỗi của bạn tối đa 2 và xem đầu ra SQL. Tìm truy vấn mà mã của bạn đang tạo và bạn sẽ nhận thấy có một số. Lớp ORM trong CakePHP không tham gia các bảng có liên quan đến HABTM trong truy vấn đầu tiên. Nó nhận được kết quả từ lần chọn đầu tiên, sau đó lấy riêng dữ liệu HABTM cho mỗi mục. Bởi vì bảng kết nối không có trong truy vấn đầu tiên, điều kiện của bạn, được dự định để sử dụng trên một bảng đã nối kết, dẫn đến lỗi bạn đang thấy.

Cuốn sách nấu ăn có một phần trên HABTM associations và tìm nạp dữ liệu dựa trên các điều kiện trong bảng HABTM phù hợp với yêu cầu của bạn.

+0

Xin cảm ơn, thông tin về Legit. – usumoio

2

Bảng của bạn nên được gọi là "schools_users" chứ không phải "school_members" vì nó rất nhiều, do đó, sử dụng dạng số nhiều trong tên bảng ở cả hai bên là thích hợp.

Bạn cũng đặt Tên lớp mô hình là "Trường học" làm Bí danh cho HABTM. Bạn nên thay đổi điều đó thành một cái gì đó chung chung hơn như "Trường học" như trong "Người dùng ở trong và có nhiều trường học" để tránh xung đột.

Và gợi ý khác: Cố gắng tìm người dùng "qua" Mô hình trường học thay vì Mô hình người dùng.

$ this-> User-> Schools-> find()

Hy vọng điều này sẽ hữu ích.

5

Từ Cookbook: http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM

Một lựa chọn là để tìm kiếm các mô hình Tag (thay vì Recipe), mà cũng sẽ cho chúng ta tất cả các công thức nấu ăn liên quan.

$this->Recipe->Tag->find('all', array(
    'conditions' => array('Tag.name' => 'Dessert'))); 

Chúng tôi cũng có thể sử dụng mô hình bảng kết nối (mà CakePHP cung cấp cho chúng tôi) để tìm kiếm một ID nhất định.

$this->Recipe->bindModel(array('hasOne' => array('RecipesTag'))); 
$this->Recipe->find('all', array(
    'fields' => array('Recipe.*'), 
    'conditions' => array('RecipesTag.tag_id' => 124) // id of Dessert 
)); 

Nó cũng có thể tạo ra một hiệp hội kỳ lạ với mục đích tạo ra càng nhiều tham gia khi cần thiết để cho phép lọc, ví dụ:

$this->Recipe->bindModel(array('hasOne' => array('RecipesTag', 
    'FilterTag' => array(
     'className' => 'Tag', 
     'foreignKey' => false, 
     'conditions' => array('FilterTag.id = RecipesTag.tag_id') 
)))); 
$this->Recipe->find('all', array(
    'fields' => array('Recipe.*'), 
    'conditions' => array('FilterTag.name' => 'Dessert') 
)); 
+1

Đây là, tôi cảm thấy, câu trả lời hay nhất - Một điều cần lưu ý là bạn phải đảm bảo rằng việc sử dụng 'tìm' có chứa trên mô hình mà bạn đã ràng buộc. Vì vậy, 'chứa' => 'FilterTag' sau điều kiện của bạn. – TeckniX

Các vấn đề liên quan