嗨,我是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'
)
);}
我的数据库表名称是金属,产品和 metal_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))
答案 0 :(得分: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
如果你更像是一个视觉学习者,那么这个视频应该可以帮助你完成基础知识
答案 1 :(得分: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' => ''
));
}
这对我来说完美无缺。 希望它适用于所有人。