【问题标题】:CakePHP to save relationship in other modelCakePHP 在其他模型中保存关系
【发布时间】:2013-05-10 07:56:52
【问题描述】:

我有这些模型:

class Prefix extends AppModel {
    public $displayField = 'prefix';

    public $hasMany = array(
        'State' => array(
            'className' => 'State',
            'foreignKey' => 'prefix_id',
            'dependent' => false,
        ),
    );
}

class State extends AppModel {
    public $displayField = 'name';

    public $belongsTo = array(
        'Prefix' => array(
            'className' => 'Prefix',
            'foreignKey' => 'prefix_id',
        ),
    );
}

然后我有这个admin_add 方法,来自自动脚手架:

public function admin_add() {
    if ($this->request->is('post')) {
        $this->Peefix->create();
        if ($this->Prefix->save($this->request->data)) {
            $this->redirect(array('action' => 'index'));
        } else {
                            // Error message
        }
    }
    $states = $this->Prefix->State->find('list');
    $this->set(compact('states'));
}

我的表单中也有它们的列表:

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

现在我可以为Prefix 设置States。但是,当我提交表单时,选择消失了。它没有保存在数据库中。

我做错了什么?

【问题讨论】:

    标签: php cakephp foreign-key-relationship many-to-one


    【解决方案1】:

    您将模型链接起来,好像每个前缀只有一个状态,并且许多前缀“分配”到一个状态。这意味着您不能使用'multiple' =&gt; 'checkbox'。因此,要么删除它,要么将模型关联更改为 HABTM。

    【讨论】:

      【解决方案2】:

      首先,hasManybelongsTo 的两个外键必须相同。如果在父模型中提供了invoice_circle_id 作为键,那么在子模型中也必须提供相同的值。显然,该字段必须存在于子表中。更多信息请参见http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

      第二 - 您可能希望使用 saveAll() 或 saveAssociated() 方法来保存链接模型数据。同样 - http://book.cakephp.org/2.0/en/models/saving-your-data.html 包含您需要的所有信息。

      至于hasMany的输入字段命名,你可以这样命名:

      $this->Form->input('ParentModel.fieldname');
      $this->Form->input('ChildModel.0.fieldname');
      

      【讨论】:

      • 我读到了,但我找不到它如何适用于我的情况。我必须为每个$state$this-&gt;Form-&gt;input('State.' . $i . '.prefix_id');?什么将作为值?
      • 外键会自动给每个州,但是,你需要手动给其他州的字段值。
      • 好的,但是外键是我想给状态字段的唯一值...我认为最好在控制器上手动设置它。
      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      相关资源
      最近更新 更多