2011-11-09 21 views
6

Tôi có một bảng được gọi là các loại. Bảng chứa các loại và phụ (subsub) loại của họ ...Cách thực hiện mô hình tự tham chiếu (parent_id) trong cakephp

của một bảng đơn giản:

  • id
  • PARENT_ID
  • tiêu đề

Bằng cách này tôi có thể làm cho loại với chiều sâu vô tận ... Tôi hy vọng rằng cakephp sẽ hiểu parent_id (tôi cũng đã thử category_id, nhưng điều đó làm cho bánhPHP tham gia vào chính nó: D)

Cách nào đúng để giải quyết vấn đề này?

LƯU Ý: Cũng có bảng 'nhiều đến nhiều' được gọi là địa điểm. Những địa điểm đó có thể thuộc về một hoặc nhiều danh mục.

Trả lời

18

Hành vi của cây quá mức cần thiết cho tình huống này. Bạn chỉ cần thiết lập mô hình của bạn lên như thế này:

class Category extends AppModel { 

    public $hasMany = array(
    'Children'=>array(
     'className'=>'Category', 
     'foreignKey'=>'parent_id' 
    ) 
); 

    public $belongsTo = array(
    'Parent'=>array(
     'className'=>'Category', 
     'foreignKey'=>'parent_id' 
    ) 
); 

} 

Bây giờ, khi bạn làm một find() trên Danh mục, bạn sẽ nhận được hai mô hình bổ sung được gọi Chánh (mà chỉ vào id mẹ) và Trẻ em (trong đó liệt kê đó là trẻ em).

+0

Hey Richard, tôi đang tìm kiếm hành vi của cây, nhưng tôi đồng ý rằng nó có thể là quá mức cần thiết. Dù sao đi nữa. Cảm ơn bạn đã chỉ ra điều này! –

2

Trong loại mô hình: belongsTo mẹ và hasMany Trẻ em, cả hai đều có lớp 'Chuyên mục' và khóa ngoại 'PARENT_ID'

5

Nhìn vào tree behaviour; với logic MPTT. Liên kết được cung cấp cho trang web của Oracle đã chết; nhưng bạn có thể tìm thấy một loạt tài liệu về cách sử dụng nó trên cake manualonline.

CREATE TABLE categories (
    id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    parent_id INTEGER(10) DEFAULT NULL, 
    lft INTEGER(10) DEFAULT NULL, 
    rght INTEGER(10) DEFAULT NULL, 
    name VARCHAR(255) DEFAULT '', 
    PRIMARY KEY (id) 
); 

Chỉ cần đảm bảo rằng bảng của bạn khớp với cấu trúc đó để có kết quả tốt nhất trong bánh và bánh nướng.

+0

Cảm ơn người đàn ông, những thứ thú vị, và thực sự chính xác những gì tôi cần. Mọi thứ được thiết lập suôn sẻ! –

+0

Trong nhiều trường hợp, điều này là quá mức cần thiết. Một bảng tự tham khảo đơn giản như đã đề cập dưới đây của Anh Phạm với các hiệp hội thích hợp là quá đủ trong phần lớn các nguyên nhân. Hành vi của cây ngày càng trở nên hữu ích vì mức độ "chiều sâu" vượt xa mức độ (ví dụ: trẻ em có thể có con). – pimbrouwers

0

Câu hỏi liên quan - giả sử tôi có phân cấp tự tham chiếu 3 cấp được thực hiện theo lời khuyên của @RichardAtHome - Tôi hiểu khi tôi cố gắng tìm một Danh mục cụ thể, nó cũng sẽ đưa tôi vào danh mục gốc và tất cả các danh mục con. Tuy nhiên làm thế nào tôi có thể làm cho nó tìm thấy con đường trở lại root? Có một số thủ thuật rõ ràng để thực hiện điều này hoặc sẽ yêu cầu một hack tùy chỉnh? Tôi tưởng tượng sử dụng điều này trong một kịch bản mà trong đó bảng Product có một ID danh mục được liên kết với nó nhưng khi hiển thị cho người dùng, tôi cũng muốn hiển thị toàn bộ chuỗi gốc để họ có thể thấy một cái gì đó như 'bánh kẹo/theo mùa/nương náu '- và sau đó người dùng có thể thay đổi toàn bộ hệ thống phân cấp sản phẩm

1

các custom recursive function tree() sau làm việc cho tôi

public function index() { 
    $c = $this->tree(); 
    debug($c); 
    exit; 
} 


function tree($parent=null){ 
    $arr = array(); 
    $categories = $this->Category->find('all',array(
     'conditions'=>array('Category.parent_id '=> $parent) 
    )); 
    foreach($categories as $key => $category){   
     $arr[$category['Category']['id']]['title'] = $category['Category']['name'];    
     $arr[$category["Category"]["id"]]['children'] = $this->tree($category['Category']['id']); 
    } 
    return $arr; 
} 
Các vấn đề liên quan