【问题标题】:saveAssosiated with 3 models保存关联3个模型
【发布时间】:2015-06-10 06:01:45
【问题描述】:

当我保存多个模型时,我无法将 Company.id 放入 License.company_id。我在许可证表中需要 company_id 的原因是公司拥有许可证,并将为其用户/员工分配许可证。

我有这些表:公司、用户和许可证。

许可证:belongsTo Company,hasMany User。

公司:hasMany 许可证,hasMany 用户。

用户:belongsTo Company,belongsTo License。

公司表:

id
name

用户表:

id
company_id
license_id
email
password

许可证表:

id
company_id

UsersController.php

public function register() {

    $expires = date("Y-m-d H:i:s", strtotime("+30 days"));
    $this->set('expires', $expires);

    if ($this->request->is('post')) {
        $this->request->data['User']['language'] = 'nor';
        $this->request->data['User']['role'] = 'admin';
        $this->request->data['User']['active'] = '1';
        $this->User->create();
        if ($this->User->saveAssociated($this->request->data, array('deep' => true))) {
            $this->Session->setFlash(__('The user has been saved.'), 'default', array('class' => 'notice success'));
            return;// $this->redirect(array('controller' => 'landing', 'action' => 'index'));
        } else {
            $this->Session->setFlash(__('The user could not be saved. Please, try again.'), 'default', array('class' => 'notice error'));
        }
    }
}

用户/register.ctp

<?php echo $this->Form->create('User', array('controller' => 'users', 'action' => 'register')); ?>
<?php
    echo $this->Form->input('Company.name', array('placeholder' => __('Company')));
    echo $this->Form->input('name', array('placeholder' => __('Name')));
    echo $this->Form->input('email', array('class' => 'form-control', 'placeholder' => __('E-mail')));
    echo $this->Form->input('mobile', array('placeholder' => __('Mobile number')));
    echo $this->Form->input('password', array('placeholder' => __('Password')));
    echo $this->Form->input('License.product_id', array('type' => 'hidden', 'value' => '1'));
    echo $this->Form->input('License.amount', array('type' => 'hidden', 'value' => '2'));
    echo $this->Form->input('License.renewal', array('type' => 'hidden', 'value' => '0'));
    echo $this->Form->input('License.expires', array('type' => 'hidden', 'value' => $expires));
?><?php echo $this->Form->end(__('Submit')); ?>

编辑:我也在另一个模型(公司)中尝试过相同的代码。 User.license_id 正确保存,但 Lisence.company_id 没有。

这是我在 $this->User-create() 之前得到的:

    Array
(
    [Company] => Array
        (
            [name] => Company AS
        )

    [User] => Array
        (
            [name] => Ola Nordmann
            [email] => ola@nordmann.no
            [mobile] => 99229922
            [password] => qwertyui
            [language] => nor
            [role] => admin
            [active] => 1
        )

    [License] => Array
        (
            [product_id] => 1
            [amount] => 2
            [renewal] => 0
            [expires] => 2015-05-05 23:39:10
        )

)

【问题讨论】:

  • 你能不能在$this-&gt;User-create()之前写一个pr($this-&gt;request-data);
  • 我用输出更新了第一篇文章。我认为这是预期的(和想要的)。现在查询中缺少的是 [License][company_id]。

标签: php mysql cakephp cakephp-2.0


【解决方案1】:

目前,它正在保存用户及其关联的公司,以及用户及其关联的许可证。您的代码中没有任何内容表明许可证和公司之间应该存在直接关联。

一家公司可以拥有多个许可证。在这种数据格式中,CakePHP 怎么知道您打算让这个特定的用户许可也属于他们的公司?

话虽如此,您可能需要将其分解为不同的保存。

在我的脑海中,我可能会用它的数据保存用户,然后用它的关联许可证保存公司。因为此时您已经有了 user_id,所以您可以在数据中包含预填充的 Company.user_idLicense.0.user_id 字段以进行保存。

// pseudo code:
// Save User via the User model
// get User's new id based on the just-created row
// Create data array from data passed by user and just-retrieved user_id
// save Company via the Company model including it's associated License

【讨论】:

    【解决方案2】:

    现在我有一种方法可以做到这一点,但我不知道是否还有其他更简单或更好的方法。

    这是我的代码:https://gist.github.com/sjundee/2683820962ab24047bb8

    在 register() 函数中,我首先将新记录保存在 Companies、Users 和 Licenses 中,但由于未保存 License.company_id,我将 License.company_id 更新为 $this-&gt;User-&gt;Company-&gt;id,这让我获得了保存到 Companies 中的 row-id .

    【讨论】:

    • 这与我提供的解释为什么它不起作用并说您需要“将其分解为不同的保存”的答案有何不同?
    • 是的,感谢您的帮助。答案是回复您的评论。我仍然认为他们是一种更容易做到这一点的方法,但不知道如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多