【问题标题】:cakePHP saving entries to join table of existing recordscakePHP 保存条目以连接现有记录表
【发布时间】:2013-03-08 16:04:03
【问题描述】:

首先是一个简短的描述。我必须模型:帐户和用户以及它的连接表accounts_users。模型在每个模型上都有一个 habtm 关联:

用户模型:

    'Account' => array(
        'className' => 'Account',
        'joinTable' => 'accounts_users',
        'foreignKey' => 'user_id',
        'associationForeignKey' => 'account_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )

帐户模型:

        'User' => array(
        'className' => 'User',
        'joinTable' => 'accounts_users',
        'foreignKey' => 'account_id',
        'associationForeignKey' => 'user_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )

现在我试图将这两者之间的关系手动保存到连接表 acccounts_users 从所有现有条目中,这里是我的代码

        $account = base64_decode($this->params['pass']['0']);
    $token = $this->params['pass']['1'];


    if($user = $this->User->findByToken($token))
    {
        // ZUr test zwecken
       # $this->User->query(" INSERT INTO accounts_users (account_id ,user_id) VALUES (222, 223); ");
        $aId = $this->Account->findById($account);
        $this->data['User'][0]['user_id'] = $user['User']['id'];
        $this->data['Account'][0]['account_id'] = $aId['Account']['id'];



        $this->User->bindModel(array(
            'hasMany' => array('AccountsUser')
        ));
        $this->User->saveAll($this->data, array('validate' => false));


        print_r('gefunden'); die;
        $this->Redirect->flashSuccess('Account Invitation successfull. Log In!', array('controller' => 'users', 'action' => 'login'));
    }
    else
    {
        print_r('nicht gefunden'); die;
        // user nicht gefunden zum login umleiten
        $this->Redirect->flashWarning('Account Invitation error. Please try again!', array('controller' => 'users', 'action' => 'login'));

    }

结果是 accounts_users 表上的一个新条目,但 user_id 为 0。我不明白为什么缺少用户 id,因为它通过了正确的方式。即使我在数据数组中手动​​传递了一些 id,它只写了 account_id 而没有用户 id。

更新

我对模型进行了一些操作,并通过帐户模型将数据保存到 accounts_users 中,请参阅更新后的代码:

            $this->data['User']['id'] = $user['User']['id'];
        $this->data['Account']['id'] = 33; #$aId['Account']['id'];

        $this->Account->AccountsUser->create();

        $this->Account->saveAll($this->data, array('validate' => false));

所以现在脚本会插入两个 id,但是,如果另一个用户的输入表单具有相同的帐户 id,则该用户会被覆盖。其他任何工作。关于如何为新用户创建具有轴心帐户 ID 的新条目的任何想法?

这是我得到的 mysql 查询:

更新accounts SET id = 33 其中accounts.id = 33

选择AccountsUser.user_id FROM accounts_users AS AccountsUser WHERE AccountsUser.account_id = 33

accounts_users 删除AccountsUserAccountsUser 其中AccountsUser.account_id = 33 和

插入accounts_users (account_id,user_id) 值 (33,'32')

任何想法为什么?提前致谢

【问题讨论】:

  • 看看“HasMany Through”,而不是这种疯狂的绑定模型……等等;)
  • 你使用的是 cakephp 2.x 吗?
  • 不,我使用的是 cake 1.3。有什么区别吗?
  • 嘿,戴夫,你能解释一下你的意思吗?

标签: cakephp model has-and-belongs-to-many jointable


【解决方案1】:

CakePHP 1.x 对待 HABTM 连接表相当“愚蠢”;它将删除所有现有记录并插入新记录以替换它们。如果您的连接表还包含其他数据,则这是一个主要的 PITA。 (可以通过在 beforeSave() 回调中添加一些代码来防止这种情况发生)

CakePHP 2.1 有一个选项 keepExisting 用于 HABTM 关系。该选项防止 CakePHP 删除 JOIN 表中的记录。如果这是一个新项目,我真的建议使用 CakePHP 2.x,因为自 CakePHP 1.x 以来,lot 已经有所改进。

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasmany-through-the-join-model

在连接表中保存数据的一些提示可以在这里找到;

http://book.cakephp.org/2.0/en/models/saving-your-data.html#saving-hasmany-through-data

对于 CakePHP 1.3(看下面的“HABTM 变得复杂时”)

http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Models.html#saving-related-model-data-habtm

【讨论】:

  • 好的,谢谢,这是一个好点。不,是我们更新和改进的旧项目。我解决了帐户模型中唯一 => false 的问题,但现在模型创建了重复条目。还是个问题
  • CakePHP 1.3 可以使用相同的技术,我在答案中添加了文档,但是为了防止 CakePHP 删除记录,您可能必须添加一些自定义逻辑。如果我没记错的话,有人为 CakePHP 1.3 写了一个插件来处理这种情况,现在不记得它的名字了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多