Cakephp - 将多个复选框保存到连接表

时间:2013-03-01 16:50:47

标签: php cakephp

我需要帮助将多个复选框保存到连接表。

共有3个表格:

  • 客户(ID,姓名,地址)
  • 产品(id,product_name,desc)输入所有产品。
  • Customers_Products (id,product_id,customer_id)&lt ;-(加入表格)

第1步:
客户选择所需的产品(复选框中的苹果,橙子,樱桃) 然后点击<Next>按钮

第2步:
填写关于他们自己的表格(姓名,地址等)。 然后点击<Submit>按钮

第3步:
我正在将步骤2中的个人信息保存到Customers表,并将选定的产品ID从步骤1保存到Customers_Products表。 它确实将个人信息和产品ID保存到指定的表中,但是当客户选择多个产品时,它不会保存产品ID。 它添加了行,但产品ID字段为空。

以下是我的观点:

  • <?php echo $this->Form->checkbox('CustomerProduct.product.', array('value' => '1', 'style' => 'float: left; display: inline')); ?>
  • <?php echo $this->Form->checkbox('CustomerProduct.product.', array('value' => '2', 'style' => 'float: left; display: inline')); ?>
  • <?php echo $this->Form->checkbox('CustomerProduct.product.', array('value' => '3', 'style' => 'float: left; display: inline')); ?>
  • <?php echo $this->Form->input('Customers.name', array('value'=>'Jon Toshmatov')); ?>

控制器:

$this->Prospect->saveAll($this->request->data);

型号:

public $hasAndBelongsToMany = array(
    'CustomerProduct' => array(
        'className' => 'CustomerProduct',
        'joinTable' => 'customers_products',
        'foreignKey' => 'customer_id',
        'associationForeignKey' => 'product_id',
        'unique' => 'false',
        'dependent' => false,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    )

期望的结果: 我想按以下顺序保存数据:

Customers table:
id     name
1      Jon T

Customers_Products *(join table)*
id   product_id   customer_id
1    4            1
2    3            1
3    5            1

1 个答案:

答案 0 :(得分:0)

问题是如果通过CakePHP formhelper创建,每个复选框也会添加一个“隐藏”输入。添加此隐藏输入以确保复选框始终发送值(0或1),即使未选中它们也是如此。

但是,在您的示例中,您创建了3个具有相同“名称”的复选框,因此每个复选框都会覆盖以前的值。

最好的方法是使用CakePHP formhelper创建一个“多个”复选框;

echo $this->Form->input('Product', array('multiple' => 'checkbox'));

为了使其正常工作,应该有$products viewVar,其中包含product-ID和标签;

在你的控制器内:

public function some_action()
{
     // your code here

     $this->set('products', $this->Customer->Product->find('list'));
}

更多关于在此保存HABTM数据的信息; http://book.cakephp.org/2.0/en/models/saving-your-data.html#saving-related-model-data-habtm

注意 除非您为模型使用非标准名称,否则您的hasAndBelongsToMany似乎不正确;

怀疑你的关系是Customer hasAndBelongsTo Product,而不是CustomerProduct

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