2013-05-08 3 views
0

Привет, я новичок в cakephp и делаю проект на cakephp 2.3.4.
Мне нужно связать класс металла продукта через множество связей. Но, похоже, это не работает.Не удается сохранить связанные данные с hasMany through (Join Model)

код модели

class Metal extends AppModel { 
public $hasMany = array(
    'MetalProduct' 
); 
} 

class Product extends AppModel { 
public $hasMany = array(
    'MetalProduct' 
); 
} 

App::uses('AppModel', 'Model'); 

class MetalProduct extends AppModel { 

public $belongsTo = array(
    'Metal' => array(
     'className' => 'Metal', 
     'foreignKey' => 'metal_id' 
    ), 
    'Product' => array(
     'className' => 'Product', 
     'foreignKey' => 'product_id' 
    ) 
);} 

Мои имена таблиц баз данных металла, продукты и metal_products

У меня есть несколько выбора опции для выбора более одного типа металла.
Это, как я получаю список металлов

 $metals=$this->Metal->find('list'); 
    $this->set(compact('metals')); 

FormHelper код для ListBox является

<?php echo $this->Form->input('Metal',array('type' => 'select', 
               'multiple' => true)); ?> 

Продукт становится успешно сохранен, но ассоциации не являются.
Массив отладки дать мне этот

$message = array(
'Product' => array(
    'category_id' => '517a514b-0eb0-4ec9-b018-0b948620d4f0', 
    'name' => 'mangalsutra Diamond', 
    'slug' => 'mangalsutra_diamond', 
    'description' => '1212', 
    'Metal' => array(
     (int) 0 => '5183cb65-bf90-459c-b22e-0b748620d4f0', 
     (int) 1 => '5183ce25-c744-433e-b035-0b748620d4f0' 
    ), 
    'image' => '121212', 
    'price' => '12121', 
    'weight' => '12', 
    'active' => '1', 
    'category' => 'Mangalsutra' 
) 
) 

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

У меня есть сомнения, что ее не экономить, так как металлический массив передается как этот

'Metal' => array(
     (int) 0 => '5183cb65-bf90-459c-b22e-0b748620d4f0', 
     (int) 1 => '5183ce25-c744-433e-b035-0b748620d4f0' 
    ), 

Следует отметить «id''rather чем (INT) 0 или что-то.

Кроме того, моя таблица базы данных для metal_products, которую я создал вручную имеет

id(primary key) 
    metal_id(foreign key to Metal.id) 
    product_id(foreign key to Product.id) 

Я делаю что-то неправильно с именования или базы данных, каким образом будут созданы? Пожалуйста, дай мне правильный ансу вызвать все, что я пытался от других отвечать не работает

Я спасаю его через

 $this->Product->saveAll($this->request->data, array('deep' => true)) 
+0

Вы хотите сказать 2.3.4? CakePHP 2.4 даже не бета/RC еще – fullybaked

+0

извините, мой плохой 2.3.4 это я исправлю его –

+0

Есть ли какая-то особая причина, по которой вы используете hasMany-belongsTo-hasMany, а не HABTM? – Nunser

ответ

0

О связи я генерироваться с помощью Выпекать выглядит примерно так

class Product extends AppModel { 

/** 
* hasAndBelongsToMany associations 
*/ 
public $hasAndBelongsToMany = array(
    'Metal' => array(
     'className' => 'Metal', 
     'joinTable' => 'metals_products', 
     'foreignKey' => 'product_id', 
     'associationForeignKey' => 'metal_id', 
     'unique' => 'keepExisting', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '', 
     'limit' => '', 
     'offset' => '', 
     'finderQuery' => '', 
     'deleteQuery' => '', 
     'insertQuery' => '' 
    )); 
} 

class Metal extends AppModel { 
/** hasAndBelongsToMany associations */ 
public $hasAndBelongsToMany = array(
    'Product' => array(
     'className' => 'Product', 
     'joinTable' => 'metals_products', 
     'foreignKey' => 'metal_id', 
     'associationForeignKey' => 'product_id', 
     'unique' => 'keepExisting', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '', 
     'limit' => '', 
     'offset' => '', 
     'finderQuery' => '', 
     'deleteQuery' => '', 
     'insertQuery' => '' 
    )); 
    } 

/** 
    * MetalsProduct Model 
    * @property Product $Product 
    * @property Metal $Metal 
    */ 
    class MetalsProduct extends AppModel { 
    /* belongsTo associations */ 
public $belongsTo = array(
    'Product' => array(
     'className' => 'Product', 
     'foreignKey' => 'product_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    ), 
    'Metal' => array(
     'className' => 'Metal', 
     'foreignKey' => 'metal_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    )); 
    } 

Это работал для меня безотказно. Надеюсь, он работает на всех.

0

В вашей модели, это все, что в вашей MetalProduct модели? В этом случае вы должны переместить

class Metal extends AppModel { 
public $hasMany = array(
    'MetalProduct' 
); 
} 

к модели металла и

class Product extends AppModel { 
public $hasMany = array(
    'MetalProduct' 
); 
} 

к модели продукта

добавить также ваш belongsTo каждой модели

Я вижу, у вас есть присоединиться Таблица. Объединение таблиц обычно выполняется для ассоциаций HABTM. Это HasMany. Вам нужно использовать другие доступные опции для определения отношений внешних ключей в каждой модели, как описано выше.

См. Примеры документации на торты.

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

Кроме того, если вы не уверены в том, как настроить модели правильно, вы всегда можете использовать функцию Выпекать в CakePHP для создания моделей и коды для вас в этом отношении.

book.cakephp.org/2.0/en/console-and-shells/code-generation-with-bake.html

Если вы больше визуального обучающийся это видео репетит должен помочь вам через основу

http://www.youtube.com/watch?v=kJAMifqF5s8

+0

Моя модель была настроена точно так же, как вы предложили, и я хочу, чтобы hasMany Through association работала. В соответствии с этим нам просто нужно создать третью модель MetalProduuct в качестве объяснения в примере http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html, в котором говорится, что нужно создать модель CourseMembership для get hasMany Через работу. Это выглядит так просто, я точно сделал то же самое с моими моделями и создал базу данных соответственно. Но по какой-то причине он не работает. Я уже реализовал ссылки, которые вы упомянули, но ничего не работает. PLZ нужна помощь –

+0

Наконец-то исправил. Спасибо за указатель Джонсон. Сначала я построил связь с базой данных и испекли модели, используя печенье. Который определил все отношения в моделях. Хотя это было так же, как я сделал это как-то после выпечки моделей, используя печенье, заставило его работать. Только изменения, которые я должен был сделать, были связаны с отношениями продуктов и категорий. Category Model имеет древовидную структуру, поэтому мне пришлось определить отношение hasmany между категорией для себя, чтобы заставить generateTreeList работать. Я предлагаю всем начинающим новичкам использовать печенье для создания моделей, а затем продвигаться вперед с развитием. благодаря –

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