【问题标题】:CakePHP saving Foreign Key IssueCakePHP 保存外键问题
【发布时间】:2012-08-24 03:51:43
【问题描述】:

我在将用户表的外键保存到另一个名为 Basics 的表中时遇到问题。我正在尝试向用户提出一系列问题,并且每个完成的系列,问题和用户 ID 都应该保存到相应的表中。

这是在模型中进行验证后保存我的数据的内容。验证成功,因为所有数据都保存了,但外键保存为 0。

public function pageone() {
    if ($this->request->is('post')){

        $this->request->data['Table1']['user_id'] = $this->Auth->user('id');
        if ($this->User->saveAll($this->request->data)) {
            $this->redirect(array('action'=>'pagetwo'));
        } else {
            $this->Session->setFlash('Your data have not been saved');
        }
    }
}

在我的模型中,我使用以下代码声明了外键:

var $name = 'Table1';
var $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

这应该声明外键,对吧?我的外键的列名称为“user_id”。数据类型均为 INT。数据库方面可能还有其他问题吗?提前致谢!

更新:所以 - 我现在将我的用户 ID 隐藏在一个隐藏字段中。该字段将在我创建的任何其他字段中输入到数据库中(即使具有与 INT(11) 相同的数据类型),但它不会保存到名为“user_id”的字段中。例如,我可以将用户 ID 保存到名为 my_id 的字段中,但使用 user_id 仍然没有运气。我认为这排除了数据库问题,并且与我如何关联模型有关。

【问题讨论】:

  • 您是否将问题保存在基本表格中?
  • 是的,我是。我用我刚刚发现的更多信息更新了我的问题。如果你看到任何东西,请告诉我。谢谢!
  • 在控制器的方法中使用pr($this->request->data);die; 打印什么?
  • 我已经添加了请求的表单数据数组。

标签: php mysql cakephp


【解决方案1】:

请在用户模型中添加关系

var $hasOne = array(
'Basic' => array(
    'className' => 'Basic',
    'foreignKey' => 'user_id',
    'conditions' => '',
    'fields' => '',
    'order' => ''
   )
 );

【讨论】:

  • 谢谢 - 你是对的,我需要将关系添加到用户模型。不过,我仍然无法在我的外键字段中输入用户 ID。我有两个隐藏的输入试图将数据输入到 user_id 字段和 my_id 字段中。这两个字段是相同的数据类型。当我将 foreignKey 值切换到 my_id 时,问题从 user_id 字段切换到 my_id 字段。你认为我错误地关联了我的模型吗?
  • OP 的前 3 行是在说别的东西。一个用户可以有多个问题,这些问题将保存到basics 表中。不是吗?
  • 否 - basics 表中有多个问题,但用户只保存一行。对不起!
【解决方案2】:

你请求的数组应该是这样的:

Array
(
    [User] => Array
              (
                  //field list of User Model
               )

    [Basic] => Array
              (
                  //field list of Basic Model
               )
)

要实现这一点,您可以在服务器端操作请求的数组或更改表单中的字段名称,例如:

<?php echo $this->Form->input('User.first_name', array());?>
//and
<?php echo $this->Form->input('Basic.field_name', array());?>

然后您将能够使用以下方法保存关联记录:

$this->User->saveAll($this->request->data, array('deep' => true));

'deep' =&gt; true 选项也将帮助您保存相关记录。它还会自动将 user_id 保存到您的基本表中。

不要忘记定义模型关联船舶。

【讨论】:

  • 太棒了!即使我们没有保存任何用户数据 - 我们仍然将 id 放在该字段中?我将它放置为“id”,存储主要 id 的位置,并将其添加到 Basics 表中。有趣 - 我假设您会像所有其他数据一样将数据存储在 Basics 表中,并告诉 Cake 关联以供以后查询。非常感谢您的帮助!
猜你喜欢
  • 2017-07-05
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 2011-09-17
  • 2013-12-28
  • 1970-01-01
相关资源
最近更新 更多