CakePHP: HABTM и Рекурсивный атрибут, чтобы получить все связанные данные - PullRequest
1 голос
/ 25 февраля 2012

У меня проблемы с отношениями HABTM в моей модели.Я искал примеры и ссылки на этом сайте и многих других в течение нескольких недель безуспешно.Классическая публикация тегов HABTM официальная документация работает хорошо, но экстраполировать на мою модель не удается.Вся найденная информация не содержит примеров или ссылок для составных первичных ключей (я подозреваю, что отношения не будут работать из-за составных первичных ключей, и я не могу изменить эту схему)

Моя цель - получить Отношения:

 Customer HABTM Products.

Итак, с

$ customer = $ this-> Customer-> find ('all');

Получить массив всех продуктов, относящихся кcustomer в объекте Customer.

В настоящее время я не могу заставить это работать: $ customer не имеет указанного массива Products .

Я признателен за любую помощь или ссылку, чтобы помочь мне исправить это.

Это моя база данных:

CREATE TABLE `customers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lang` varchar(2) NOT NULL,
  `name` varchar(145) NOT NULL,
  `logo` varchar(145) NOT NULL,
  `description` text,
  PRIMARY KEY (`id`,`lang`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8

CREATE TABLE `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lang` varchar(2) NOT NULL,
  `category_id` int(11) NOT NULL,
  `service_id` int(11) NOT NULL,
  `description` text,
  `picture` varchar(145) NOT NULL,
  PRIMARY KEY (`id`,`category_id`,`service_id`,`lang`),
  KEY `fk_products_services1` (`service_id`,`lang`),
  KEY `fk_products_categories1` (`category_id`,`lang`),
  CONSTRAINT `fk_products_categories1` FOREIGN KEY (`category_id`, `lang`) REFERENCES `categories` (`id`, `lang`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_products_services1` FOREIGN KEY (`service_id`, `lang`) REFERENCES `services` (`id`, `lang`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8


CREATE TABLE `customer_products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `customer_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
   PRIMARY KEY (`id`,`customer_id`,`product_id`),
   KEY `fk_customer_products_products1` (`product_id`),
   KEY `fk_customer_products_customers` (`customer_id`),
   CONSTRAINT `fk_customer_products_customers` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
   CONSTRAINT `fk_customer_products_products1` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

Это моя модель клиента:

<?php
App::uses('AppModel', 'Model');
/**
 * Customer Model
 *
 * @property CustomerProduct $CustomerProduct
 * @property Product $AllProducts
 */
class Customer extends AppModel {
/**
 * Display field
 *
 * @var string
 */
    public $displayField = 'name';

    //The Associations below have been created with all possible keys, those that are not needed can be removed


/**
 * hasAndBelongsToMany associations
 *
 * @var array
 */
    public $hasAndBelongsToMany = array(
        'Products' => array(
            'className' => 'Product',
            'joinTable' => 'customer_products',
            'foreignKey' => 'customer_id',
            'associationForeignKey' => 'product_id',
            'unique' => true,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
            'deleteQuery' => '',
            'insertQuery' => ''
        )
    );

}

Это мой индекс Метод контроллера клиента:

public function index() {
    $this->layout = 'header_chico';
    $this->Customer->recursive = 0;
    $customers = $this->Customer->find('all');
    $this->set('customers', $customers);
}

1 Ответ

1 голос
/ 25 февраля 2012

Ваша таблица HABTM должна быть customers_products (не customer_products).Это, вероятно, исправит это.Помните, что формат множественного числа в алфавитном порядке.Так что, если это клиенты HABTM, то это клиенты_продукты.Если бы это были пользователи продуктов HABTM, это были бы products_users.

ОБНОВЛЕНИЕ

Если вы хотите, чтобы записи HABTM появлялись в индексе, вам также необходимо удалить:

$this->Customer->recursive = 0;

Это предотвратит связанныезаписи появляются.

...