2012-05-14 22 views
5

Tôi đang cố gắng để có được cái đầu của tôi xung quanh hai chiều tự tham khảo hasMany thông qua các mối quan hệ trong CakePHP (những gì một mouthful!).CakePHP: hai chiều tự tham chiếu hasMany Through associations

Tôi đang làm việc trên trang web phù hợp với hình ảnh.

  • Ảnh được liên kết với các ảnh khác thông qua 'khớp' (mô hình kết hợp).
  • Mỗi trận đấu có hai hình ảnh và lưu trữ xếp hạng hiện tại và tổng số phiếu bầu.
  • Khi xem ảnh, tất cả các hình ảnh liên quan từ hai hướng sẽ có sẵn (thông qua các kết quả phù hợp).

Tôi đã bắt đầu bằng cách xác định mối quan hệ hasMany thông qua mô hình tham gia.

Các pictures_matches tham gia bảng có cấu trúc này:

id | picture_id | partner_id | rating | total_votes 

trận đấu tôi tham gia mô hình hiệp hội trông như thế này:

class PictureMatch extends AppModel { 

... 

    public $belongsTo = array(
     'Picture' => array(
      'className' => 'Picture', 
      'foreignKey' => 'picture_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ), 
     'Partner' => array(
      'className' => 'Picture', 
      'foreignKey' => 'partner_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ) 
    ); 
} 

Mỗi bức ảnh cần có thể truy cập hình ảnh liên quan của nó từ hai hướng, nhưng đây là nơi nắm bắt của tôi là trượt. Có vẻ như tôi cần lưu cả hai mặt của mối quan hệ nhưng điều này phá hủy dữ liệu bổ sung được lưu trữ trong mô hình kết nối - với hai mục nhập db, biểu quyết có thể thay đổi tùy theo hướng.

Có ai có thể làm sáng tỏ cách tốt nhất để thực hiện điều này trong CakePHP không? Tôi khá bối rối.
Có thể tạo ra các mối quan hệ nghịch đảo khi đang bay không?

+3

Bạn đã bao giờ tìm ra điều này chưa? –

+0

Tên lớp có nên trong phần Đối tác có phải là 'Đối tác' không? – khany

Trả lời

0

Bạn có thể tạo các mô phỏng trên mô hình bay :: bindModel(), rất hữu ích, điều này sẽ cho phép bạn liên kết các mối quan hệ ngược lại hoặc đúng hơn bất kỳ hướng nào bạn muốn.

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

Cũng sử dụng hành vi Containable bạn có thể tạo chuỗi vô hạn của khi truy xuất ngày liên quan đến bạn cũ.

chứa ('Picture.PictureMatch.Partner.PictureMatch.Picture .....')

Về cơ bản, bạn có thể lặp qua tất cả các mô hình của bạn miễn là mỗi chuỗi là bằng cách nào đó liên quan đến việc tiếp theo để giải thích nó ví dụ đơn giản tốt hơn (xin vui lòng bỏ qua logic trong nó)

vòng belongsTo Quảng trường Quảng trường belongsTo Triangle

Vì vậy, Tam giác không liên quan đến Circle (trực tiếp), nhưng Square là kinda ở giữa

Circle->find('all', array('...', contain => array('Square.Triangle')); 

hoặc có nhiều niềm vui hơn cho phép có được vòng tròn bằng hình tròn với vòng quanh

Circle->find('all', array('...', contain => array('Square.Trinagle.Square.Circle')); 

và như vậy, tất nhiên những ví dụ là vô ích và không có bất kỳ logic lập trình, nhưng tôi hy vọng bạn hiểu được những điểm mà bạn có thể vòng máng vô hạn của các mối quan hệ đi qua lại.

0

Tôi không chắc chắn nếu điều này là giải pháp tốt nhất nhưng nếu bạn đã làm điều này:

public $belongsTo = array(
    'Picture1' => array(
     'className' => 'Picture', 
     'foreignKey' => 'picture_id', 
    ), 
    'Picture2' => array(
     'className' => 'Picture', 
     'foreignKey' => 'picture_id', 
    ), 
    'Partner' => array(
     'className' => 'Partner', 
     'foreignKey' => 'partner_id', 
    ), 
); 

sau đó khi bạn thực hiện tìm kiếm mà bạn vừa tìm kiếm ($this->data['Picture1'] == $var || $this->data['Picture2'] == $var) và chừng nào bạn có recursive thiết lập để 1 hoặc 2 bạn sẽ lấy lại tất cả dữ liệu liên quan cho số Picture.

0

Tôi giả định này bị hủy, nhưng nó dễ dàng được giải quyết - nó đã làm với giai đoạn

phá hủy các dữ liệu thêm được lưu trữ trong tham gia mô hình

Điều đó có nghĩa tiết kiệm của bạn đang chạy a deleteAll và chèn bản ghi trùng khớp ... thay vào đó bạn cần phải tìm và cập nhật bản ghi đó ...

Điều này có thể được thực hiện bằng một vài cách, nhưng cách dễ nhất là trước khi bạn lưu cuộc gọi, tìm kiếm và bao gồm các pri khóa mary trong dữ liệu bản ghi khớp. Về cơ bản, không lưu nó dưới dạng HABTM và chỉ lưu dưới dạng hasMany nếu bạn đã cố gắng tìm khóa chính hiện có của hồ sơ phù hợp (id) và cập nhật dữ liệu để lưu với nó.

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