0

我正在尝试保存用户、他们的个人资料和一些标签,以及链接个人资料和标签的连接表。

概要模型称为 Instructor,标签模型称为 Subject。讲师有一个电话号码和一个邮政编码,出于某种原因,CakePHP 认为这些是在我的联接表中创建条目时应该使用的字段。

我的加入表总是出现:

编号 | 讲师 ID | 主题ID |
1 | 90210 | 1 | // 认为邮政编码是instructor_id
2 | 1112223333 | 1 | // 认为电话号码是instructor_id
3 | 1 | 1 | // 认为user_id 是instructor_id
4 | 1 | 1 | // 实际的instructor_id,这个是正确的
5 | 90210 | 2 |
6 | 1112223333 | 2 |
3 | 1 | 2 |
4 | 1 | 2 |

我的模型:

类 Instructor 扩展 AppModel
{
    var $name = '教师';
    var $belongsTo = array('User', 'State');
    var $hasAndBelongsToMany = 数组(
        '主题' => 数组(
            'className' => '主题',
            'joinTable' => 'instructors_subjects',
            'foreignKey' => 'instructor_id',
            'associationForeignKey' => 'subject_id',
            '独特' => 真的,
            '条件' => '',
            '字段' => '',
            '订单' => '',
            '限制' => '',
            '偏移' => '',
            'finderQuery' => '',
            'deleteQuery' => '',
            '插入查询' => ''
        )   
    );
}

类 Subject 扩展 AppModel
{
    var $name = '主题';
    var $hasAndBelongsToMany = 数组(
        '教练' => 数组(
            'className' => '导师',
            'joinTable' => 'instructors_subjects',
            'foreignKey' => 'subject_id',
            'associationForeignKey' => 'instructor_id',
            '独特' => 真的,
            '条件' => '',
            '字段' => '',
            '订单' => '',
            '限制' => '',
            '偏移' => '',
            'finderQuery' => '',
            'deleteQuery' => '',
            '插入查询' => ''
        )   
    );
}

我的模型协会:

用户拥有一位讲师
教师属于用户
讲师 hasAndBelongsToMany Subject
主题 hasAndBelongsToMany Instructor

我的表单数据如下所示:

大批
(
    [用户] => 数组
        (
            [用户名] => MrInstructor
            [密码] => cddb06c93c72f34eb9408610529a34645c29c55d
            [group_id] => 2
        )

    [讲师] => 数组
        (
            [名称] => 吉米鲍勃
            [电子邮件] => jbob@gmail.com
            [电话] => 1112223333
            [城市] => 比佛利山庄
            [邮编] => 90210
            [状态] => 5
            [网站] => www.jimmybobbaseballschool.com
            [描述] => Jimmy Bob 是一名讲师。
            [user_id] => 1
            [id] => 1
        )

    [主题] => 数组
        (
            [名称] => 击球、投球
        )

)

我处理表单的函数如下所示:

    功能指导员注册()
    {
        $this->set('groups', $this->User->Group->find('list'));
        $this->set('states', $this->User->Instructor->State->find('list'));

        if (!empty($this->data)) {
            // 将组设置为 Instructor
            $this->data['User']['group_id'] = 2;

            // 保存用户数据
            $user = $this->User->save($this->data, true, array(
                '用户名',
                '密码',
                'group_id'
            ));

            // 如果用户已保存,则保存教师信息
            if (!empty($user)) {
                $this->data['Instructor']['user_id'] = $this->User->id;
                $instructor = $this->User->Instructor->save($this->data, true, array(
                    '用户身份',
                    '姓名',
                    '电子邮件',
                    '电话',
                    '城市',
                    '邮政编码',
                    'state_id',
                    '网站',
                    '描述'
                ));

                // 如果保存了教练,则保存其余的
                if(!empty($instructor)) {
                    $instructorId = $this->User->Instructor->id;
                    $this->data['Instructor']['id'] = $instructorId;

                    // 分别保存每个主题
                    $subjects = explode(",", $this->data['Subject']['name']);
                    foreach ($subjects 作为 $_subject) {
                        // 获取正确的主题格式
                        $_subject = strtolower(trim($_subject));

                        $this->User->Instructor->Subject->create($this->data);

                        $this->User->Instructor->Subject->set(array(
                            '名称' => $_subject
                        ));

                        $this->User->Instructor->Subject->save();

                        回声'
';
                        print_r($this->data);
                        回声'
'; } } } } }
4

3 回答 3

0

确保在模型中设置外键。因为这是 Cake 将使用的,因为你还没有列出你的模型,所以这是我首先要看的地方。

<?php

class Profile extends AppModel {
    var $name = 'Profile';                
    var $belongsTo = array(
        'User' => array(
            'className'    => 'User',
            'foreignKey'    => 'user_id'
        )
    );  
}
?>

更多在书中

还应该提到您的连接表不需要id字段,只需两个外键就可以了。

于 2010-06-08T13:44:40.993 回答
0

我从来不知道为什么 CakePHP 想要使用我所有的 INT 字段作为 ID,但我能够通过稍微改变一些东西并利用Jamie Fairhurst 教程中的解析函数来实现这一点。

不是单独保存每个主题,而是将它们放入一个数组中,然后使用简单的 save() 与讲师同时保存。

于 2010-06-11T11:12:12.480 回答
0

您是否尝试过saveAll方法?

if(!empty($this->data)) {
  $this->User->saveAll($this->data, array('validate'=>'first'));
}
于 2010-06-09T07:57:23.647 回答