0

嗨,我是 cakephp 新手,在 cakephp 2.3.4 上做一个项目。
我必须通过关联来关联产品金属类。但这似乎不起作用。

型号代码

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'
    )
);}

我的数据库表名是metalproductsmetal_products

我有多个选择选项来选择一种以上的金属类型。
这就是我获得金属清单的方式

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

列表框的 FormHelper 代码是

    <?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''而不是(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))
4

2 回答 2

0

在您的模型中,所有这些都在您的 MetalProduct 模型中吗?如果是这样你需要搬家

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

金属模型和

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

到产品模型

还将您的 belongsTo 添加到每个模型

我看到你有一个连接表。连接表通常用于 HABTM 关联。这是一个HasMany。您需要使用其他可用选项来定义每个模型中的外键关系,如上所述。

请参阅 Cake 文档中的示例。

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

此外,如果您不确定如何正确设置模型,您可以随时使用 Cakephp 的 Bake 功能为您生成这方面的模型和代码。

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

如果您更喜欢视觉学习者,此视频应该可以帮助您了解基础知识

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

于 2013-05-08T15:44:06.050 回答
0

我使用 Bake 生成的关系看起来像这样

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' => ''
    ));
   }

这对我来说完美无缺。希望它适用于所有人。

于 2013-05-15T14:32:55.247 回答