2013-12-24 4 views
0

привет ребята Я новичок в CakePHP теперь я столкнулся немного большая проблема здесь ситуацияглубокая связь между моделями

я хава магазин, Каталоги hasMany, который связан со многими продуктами каждый продукт имеет категория я хочу, чтобы принести их все просто получая магазин я не знаю, как сделать это пытается использовать hasMAny дает мне только идентификаторы

вместо есть ли способ, чтобы получить магазин внутри массив каталогов каждый каталог имеет массив продукта, который имеет один массив категории спасибо

enter image description here

+0

Я нахожусь на мобильном телефоне и не могу написать точный ответ, но вы должны попробовать объявить ассоциации уровня 1 в каждой модели и прочитать о сдерживаемом поведении. –

ответ

-1

Не использовать CakePHP ассоциации они не являются хорошей управляемостью сложные отношения, позже вы будете сталкиваться с проблемами с .... Вместо создать все ваши запросы присоединиться на лету ... Я даю вам один пример ниже:

Создать одну функцию внутри модели Shop и присоединиться каталог и продукт, как показано ниже:

$options = array(
     'conditions' => array('Product.id'=>9), 
     'joins' => array(
      array(
       'alias' => 'Catalog', 
       'table' => 'catalogs', 
       'type' => 'LEFT', 
       'conditions' => array(
        'Catalog.product_id = Product.id', 
       ), 
      ), 
      array(
       'alias' => 'Product', 
       'table' => 'products', 
       'type' => 'LEFT', 
       'conditions' => array(
        'Shop.id = Product.shop_id', 
       ), 
      ) 
     ), 
     'fields' => array('Product.*'), 
     'group' => array('Product.id') 
    ); 

$returnData = $this->find('all',$options); 

Это сделает кодирование немного легче, и вы можете уйти от ассоциаций!

+0

Я не знаю, как вы пришли к утверждению, что ассоциации не подходят для обработки сложных отношений. Это правда, что за пределами точки он не может автоматически вытащить данные для вас, не будучи слишком тяжелым в БД, или некоторые типы ассоциаций не могут работать за пределами точки сложности, но кроме ваших рекомендаций по ручному подключению все время на лету представляется наименее непрактичным. – user221931

+0

На лету звучит как плохая и хаотичная идея. Почему, по вашему мнению, ассоциации cakePHP не подходят для сложных отношений? –

0

Хорошо, я уже на своем компьютере :).

В ShopModel:

class ShopModel extends AppModel { 

    public $hasMany = array(
     'Catalog' => array(
      // binding params here... 
     ), 
    ); 

} 

В CatalogModel:

class CatalogModel extends AppModel { 

    public $hasMany = array(
     'Product' => array(
      // binding params... 
     ), 
    ), 

} 

... и это продолжается ...

Если вы не хотите, чтобы получить избыточные данные во всех действий, вы должны установить в AppModel:

class AppModel extends Model { 

    public $recursive = -1; 

} 

В действии контроллера, где вы вызываете функции поиска с ассоциациями:

$this->Shop->Behaviors->load('Containable'); 
$big_array = $this->Shop->find('all', array(
    'conditions' => array(
     //... 
    ), 
    'contain' => array(
     'Catalog' => array(
      'Product' => array(
       // etc, you get the point :) 
      ), 
     ), 
    ), 
)); 

Также приятно объявить $ belongsTo ассоциации, так что вы можете получить доступ что-нибудь из любого места, что-то вроде этого:

$this->Catalog->Behaviors->load('Containable'); 
$big_array = $this->Catalog->find('all', array(
    'conditions' => array(
     //... 
    ), 
    'contain' => array(
     'Product' => array(
      // ... 
     ), 
     'Shop' => array(
      // ... 
     ), 
    ), 
)); 

EDIT

Я вижу, у вас есть Product-> Категория отношение, которое я угадываю будет определяться с $ belongsTo. Если вы выполните запрос, подобный приведенному выше, вы получите много повторяющихся запросов (одна и та же категория во многих продуктах). Вы можете использовать $this->Category->find('list'), но очень часто я нахожу это неуместным, поскольку он возвращает только одно поле (я был бы признателен, если кто-то знает способ, как я могу получить больше полей со списком).Для этого, мой обходной путь делает пользовательскую функцию в модели категории, как это:

class Category extends AppModel { 

    public function getSorted ($options = array()) { 
     $temp= $this->find('all', $options); 
     $output = array(); 
     foreach ($temp[$this->alias] as $row) { 
      $output[$this->alias][$row['id']] = $row; 
     } 
     unset($temp); 
     return $output; 
    } 

} 

Тогда в контроллере я бы объявить два массива, один большой без категории ассоциации и список категорий одно:

$this->loadModel('Category'); 
$this->set('categories', $this->Category->getSorted()); 

Таким образом, я могу получить нужную строку категории по категории id везде, где она мне нужна в представлении.

Смежные вопросы