Cakephp 缺乏';必需的';表单中的字段表明我没有正确地关联模型

Cakephp 缺乏';必需的';表单中的字段表明我没有正确地关联模型,cakephp,cakephp-2.2,Cakephp,Cakephp 2.2,我在验证输入表单和保存表单中的数据时遇到问题。我怀疑这两者都是由关联问题引起的,尽管我不确定 我使用的是CakePHP2.2.0RC2 我有三个模型:用户、成员和地址。每个用户的帐户中可以有多个成员,每个用户可以有多个地址(它还记得以前的地址) 我的模型关联是: 用户模型: class User extends AppModel { public $name = 'User'; public $hasMany = array( 'Member' => array(

我在验证输入表单和保存表单中的数据时遇到问题。我怀疑这两者都是由关联问题引起的,尽管我不确定

我使用的是CakePHP2.2.0RC2

我有三个模型:用户、成员和地址。每个用户的帐户中可以有多个成员,每个用户可以有多个地址(它还记得以前的地址)

我的模型关联是:

用户模型:

class User extends AppModel {

public $name = 'User';

public $hasMany = array(
    'Member' => array(
        'className' => 'Member',
        'foreignKey' => 'user_id',
        'order' => 'Member.member ASC',
        'dependent' => true
    ),
    'Address' => array(
        'className' => 'Address',
        'foreignKey' => 'user_id',
        'order' => 'Address.address ASC',
        'dependent' => true
    )
);
...
成员模型:

class Member extends AppModel {

public $name = 'Member';

public $displayField = 'member';

public $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id'
    )
);
...
地址模型:

class Address extends AppModel {

public $name = 'Address';

public $displayField = 'address';

public $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id'
    )
);
...
public $validate = array(
    'street1' => array(
        'required' => array(
            'rule' => array( 'notEmpty' ),
            'required' => true, 'allowEmpty' => false,
            'message' => 'Please enter a street address'
        ),
....
对于我的表单创建语句,我有:

$this->Form->create( 'Member', array( 'url' => array( 'action' => 'add' ) ) );
我正在使用成员模型和控制器来处理表单,因为它只提交成员字段,或者提交成员和地址字段,这取决于用户是否已经有地址条目(如果用户没有,它会将地址输入字段添加到表单中,否则不会)

我没有在表单中提交任何用户字段

现在,我希望,如果我的关联设置正确,任何模型中的任何“必需”字段旁边都会有一个星号。在成员模型和地址模型中都有一些字段是按要求设置的,虽然成员字段在表单上显示为按要求显示(带星号),但地址字段不按要求显示

地址模型中所需的地址字段代码示例:

class Address extends AppModel {

public $name = 'Address';

public $displayField = 'address';

public $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id'
    )
);
...
public $validate = array(
    'street1' => array(
        'required' => array(
            'rule' => array( 'notEmpty' ),
            'required' => true, 'allowEmpty' => false,
            'message' => 'Please enter a street address'
        ),
....
下面是我的一些视图/表单代码:

echo $this->Form->input( 'Member.firstname', array( 'label' => 'First name', 'type' => 'text' ) );
echo $this->Form->input( 'Member.middlename', array( 'label' => 'Middle name', 'type' => 'text' ) );
echo $this->Form->input( 'Member.lastname', array( 'label' => 'Last name', 'type' => 'text' ) );
echo '<p class="bold">Please enter current address details:</p>';
echo $this->Form->input( 'Address.street1', array( 'label' => 'Street address (line 1)', 'type' => 'text' ) );
echo $this->Form->input( 'Address.street2', array( 'label' => 'Street address (line 2)', 'type' => 'text' ) );
echo $this->Form->input( 'Address.suburb', array( 'label' => 'Suburb', 'type' => 'text' ) );
...
我假设那里也应该有一个[地址]部分

我找不到任何明显的东西,但我是CakePHP新手(尽管我有PHP经验),所以任何想法都将受到欢迎

谢谢!
Peter。

首先,您说您正在使用Cake 2.2的发行候选版本(RC2)。现在有一个稳定的版本,我强烈建议您升级到这个版本

您使用
成员
模型创建表单,但它与地址没有直接关系(关联)。地址与用户关联。如果您通过用户模型创建表单,它应该可以正常工作

如果此场景(使用用户模型创建表单)不适用于您和您的应用程序 数据库模型的逻辑和模型关联是错误的,它们不符合您的业务需求。如果是这样的话,你应该考虑改变应用程序的体系结构。 还有一个关于
$uses
:您不必在控制器的$uses中包含
地址
模型,以便能够验证输入。控制器::$uses用于直接在控制器本身中使用模型(控制器自己的模型除外)。例如:

public $uses = array('Article', 'News');
在任何情况下,控制器都会在该控制器中提供所有文章和新闻模型的方法,包括:

$this->Article->methodName();


所以,我有一个答案,但我不确定这是一个好的答案。我看到很多人说在控制器中使用uses()来包含额外的模型是一件坏事。然而,2.x食谱将此列为包含其他型号的方法。如果我将“public$uses=array('Member','Address');”添加到我的MembersController中,验证就会生效。它似乎给了我所需要的。如果我在模型关联中应该做一些“更正确”的事情,我很乐意避免使用(),但是有人能告诉我这可能是什么吗?再次感谢你,这就是我要走的路了。您的地址验证应该在地址模型中。然后你可以
$this->Form->input('Address.title')并且应该正常工作(tm)