2013-12-23 4 views
1

Я пытаюсь пересечь отношения на моделях CakePHP. Это база данные: My databaseКак мне пересекать отношения CakePHP?

я могу получить доступ атрибутов продукта (продукт-> атрибуты) на модели продукта, но я не могу получить доступ к атрибутам продукта на модели объявлений (Ad-> продукт-> атрибуты).

Вот мой код:

//Product Model class Product extends AppModel { public $useTable = 'products'; public $displayField = 'name'; public $hasAndBelongsToMany = array( 'Attributes' => array( 'className' => 'Attribute', 'joinTable' => 'product_has_attributes', 'foreignKey' => 'products_id', 'associationForeignKey' => 'attributes_id', 'unique' => true, 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'finderQuery' => '', 'with' => 'product_has_attributes' ) ); public $hasMany = array( 'Ads' => array( 'className' => 'Ad', 'foreignKey' => 'Products_id', 'conditions' => '', 'order' => '', 'limit' => '', 'dependent' => true ) ); //Ad Model class Ad extends AppModel { public $displayField = 'Name'; public $belongsTo = array( 'Product' => array( 'className' => 'Products', 'foreignKey' => 'products_id', 'conditions' => '', 'fields' => '', 'order' => '' ) ); //Attribute Model class Attribute extends AppModel { public $displayField = 'name'; public $hasAndBelongsToMany = array( 'Products' => array( 'className' => 'Product', 'joinTable' => 'product_has_attributes', 'foreignKey' => 'attributes_id', 'associationForeignKey' => 'products_id', 'unique' => true, 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'finderQuery' => '', 'with' => 'product_has_attributes' ) );

// Products controller -> Action View class ProductsController extends AppController { public function view($id = null) { if (!$this->Product->exists($id)) { throw new NotFoundException(__('Invalid product')); } $options = array('conditions' => array('Product.' . $this->Product->primaryKey => $id)); $this->set('product', $this->Product->find('first', $options)); } }

// Ads controller -> Action View class AdsController extends AppController { public function view($id = null) { if (!$this->Ad->exists($id)) { throw new NotFoundException(__('Invalid ad')); } $options = array('conditions' => array('Ad.' . $this->Ad->primaryKey => $id)); $this->set('ad', $this->Ad->find('first', $options));

}

И вот что я в воззрениях:


// Продукты Просмотров: snipet из view.ctp
print_r ($ продукта);
// это печатает летящего продукта и все связанные с ним атрибуты


// Реклама Просмотров: snipet из view.ctp
print_r ($ объявления [ 'Product']);
// это напечатает только поля продукта, но не атрибуты, связанные с продуктом

Что не так? Как получить доступ к атрибуту Ad-> product-> из моей модели объявлений?

+0

использование print_r ($ объявлений); вместо print_r ($ product); –

ответ

1

Возможно, проблема может заключаться в том, что вы не используете соглашения CakePHP.

Из документов:

«Новое объединение имя таблицы должно включать в себя имена обеих моделей, участвующих в алфавитном порядке, и разделенных символом подчеркивания (_).»

Итак, ваша таблица соединений должна быть названа attributes_products.

Также проверьте свои внешние ключи. Они должны быть в единственном числе.

  • attributes_products.id
  • attributes_products.product_id
  • attributes_products.attribute_id

Надеется, что решает эту проблему.

Ссылки:

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm

http://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html#model-and-database-conventions

2

Я могу придумать пару простых способов сделать это.

Первое:

class AdsController extends AppController { 
    if (!$this->Ad->exists($id)) { 
     throw new NotFoundException(__('Invalid ad')); 
    } 
    $options = array(
     'conditions' => array('Ad.' . $this->Ad->primaryKey => $id), 
     'recursive' => 1, // or more 
    ); 
    $this->set('ad', $this->Ad->find('first', $options)); 
} 

Это было бы самым простым изменением кода, чтобы убедиться, что вы получите атрибуты, связанные с продуктом, который возвращается.

В противном случае вы упомянули об этом в своем вопросе. Вы можете получить доступ к связанным моделям через модель, так:

$this->Ad->Product->find(...); 

У меня были проблемы с Cake не любя мои условия находят при использовании связанных моделей в условиях, и я не уверен в правильном синтаксисе, но если вы хотел бы продолжить это, я уверен, что вы можете отслеживать это через документы или эксперименты.

Наконец, я бы посоветовал вам проверить ContainableBehavior, что позволит вам точно настроить, какие поля действительно возвращены в результатах. Надеюсь, это ответит на ваш вопрос!

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