2012-04-27 26 views
5

Tôi có 4 mô hình:Tìm điều kiện với mô hình hasMany

mục ------ hasMany ----> Chi tiết

mục ------ hasMany ----> yêu thích

mục ------ hasMany ----> thể loại

Làm thế nào tôi có thể tìm thấy tất cả các mục có Favourite.member_id = '8' và Category.item_category_id = '1'

đây là quan hệ mô hình mặt hàng của tôi:

public $hasMany = array(    
    'Detail' => array(
     'className' => 'Detail', 
     'foreignKey' => 'item_id', 
     'dependent' => true, 
     'conditions' => '', 
     'order' => 'created DESC',   
    ),  
    'Category' => array(
     'className' => 'Category', 
     'foreignKey' => 'item_id', 
     'dependent' => true, 
     'conditions' => '', 
     'order' => 'created DESC',   
    ), 
    'Favorite' => array(
     'className' => 'Favorite', 
     'foreignKey' => 'item_id', 
     'dependent' => true, 
     'conditions' => '', 
     'order' => 'created DESC',   
    ) 

); 

tôi đã sử dụng truy vấn này() và nó là ok:

$this->set('test',$this->Item->query("SELECT items.* 
             FROM items, categories, favourites 
             WHERE items.id = items_item_categories.item_id 
             AND items.id = favorites.item_id 
             AND categories.item_category_id = 1 AND favourites.member_id = 8")); 

Nhưng tôi không thích sử dụng truy vấn(), và tôi thay đổi nó thành find(), và có vẻ như không tốt:

$this->set('test',$this->Item->find('all', array(
               'contain'=>array(
                'ItemDetail', 
                'Category'=>array('conditions'=>array('Category.item_category_id'=>1)), 
                'Favorite'=>array('conditions'=>array('Favorite.member_id'=>8))); 

Trả lời

11

bạn cần gọi containableBehaivor trên mô hình của bạn

<?php 
class Item extends AppModel { 
    public $actsAs = array('Containable'); 
} 

tại của bạn điều khiển bạn có thể làm cho các truy vấn

$items = $this->Item->find('all', array(
      'contain'=>array(
       'ItemDetail',                 
       'Category'=>array(
         'conditions'=>array('Category.item_category_id'=>1) 
       ), 
       'Favorite'=>array(
         'conditions'=>array('Favorite.member_id'=>8) 
       ) 
      ) 
     ); 
$this->set('test', $items); 

thử sử dụng Joins

$items = $this->Item->find('all', array(
      'joins' => array( 
         array( 
          'table' => 'categories', 
          'alias' => 'Category', 
          'type' => 'inner', 
          'conditions'=> array('Category.item_category_id' => 1) 
         ), 
         array( 
          'table' => 'favorites', 
          'alias' => 'Favorite', 
          'type' => 'inner', 
          'conditions'=> array('Favorite.member_id' => 8, 'Item.id = Favorite.item_id') 
          ) 
         ), 
      'contain'=>array('ItemDetail','Category','Favorite') 
     ); 
$this->set('test', $items); 
+0

Cảm ơn bạn đã trả lời tôi, nhưng kết quả trả lại một số mảng trống, tôi không biết tại sao. –

+0

Hãy thử $ this-> Item-> Favorite-> find ('all', array ('conditions' => array ('Favorite.member_id' => 8), 'contains' => mảng ('ItemDetail', 'Category ',' Yêu thích '))); – CROWD

+0

Lỗi được ném: Mô hình "Yêu thích" không được liên kết với mô hình "Danh mục" và "ItemDetail" –

3

Bạn cũng có thể thử một cái gì đó như thế này:

$this->Item->hasMany['Favorite']['conditions']['member_id'] = 8; 

Trong đó có tác dụng tương tự như rebinding mô hình với điều kiện .

Chỉ là vấn đề có thể xảy ra. Trên đây sẽ thêm điều kiện cho phần còn lại của yêu cầu, nếu bạn muốn rollback đến hành vi trước đó, bạn cần phải bỏ đặt điều kiện:

unset($this->Item->hasMany['Favorite']['conditions']['member_id']); 

Hãy nhớ để thiết lập $ this-> item-> sở hữu đệ quy với giá trị mong muốn (recursive attribute). Mặc định là 1, đó là mức tối thiểu bạn cần để làm việc này.

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