2012-04-27 12 views
5

tengo 4 modelo:Encuentra condiciones con el modelo hasMany

artículo ------ hasMany ----> Detalle

artículo ------ hasMany ----> favoritas

artículo ------ hasMany ----> Categoría

¿Cómo puedo encontrar todo elemento que tiene Favourite.member_id = '8' y Category.item_category_id = '1'

Aquí está mi relación de modelo de artículo:

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',   
    ) 

); 

que utiliza esta consulta() y que está bien:

$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")); 

Pero no me gusta el uso de consulta(), y lo cambio en find(), y parece que no es bueno:

$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))); 

Respuesta

11

Usted necesita llamar a la containableBehaivor del modelo de

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

en su controlador que puede hacer la consulta

$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); 

tratar de usar 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

Gracias por responderme, pero el resultado devuelve una matriz vacía, no sé por qué. –

+0

Pruebe $ this-> Item-> Favorite-> find ('all', array ('condiciones' => array ('Favorite.member_id' => 8), 'contienen' => array ('ItemDetail', 'Category ','Favorito'))); – CROWD

+0

Error arrojado: el modelo "Favorito" no está asociado con el modelo "Categoría" y "Detalles del artículo" –

3

También podría intentar algo como esto:

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

que tiene el mismo efecto que volver a vincular el modelo con la condición .

Solo un posible problema. Lo anterior se sumará la condición para el resto de la solicitud, si desea restaurar al comportamiento anterior, es necesario desarmar la condición:

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

Recuerde que debe establecer el $ this-> Item-> propiedad recursiva al valor deseado (recursive attribute). El valor predeterminado es 1, que es el mínimo que necesita para que esto funcione.

Cuestiones relacionadas