CakePHP 2.1 - 保存(和创建)多个连接模型和关联模型

Posted

技术标签:

【中文标题】CakePHP 2.1 - 保存(和创建)多个连接模型和关联模型【英文标题】:CakePHP 2.1 - Saving (and creating) multiple Join Models and associated models 【发布时间】:2012-03-06 02:40:40 【问题描述】:

我的模型关系如下:

Student hasMany ClassStudent
Class hasMany ClassStudent
ClassStudent belongsTo Student
ClassStudent belongsTo Class
ClassStudent is a join model.

我想做的是创建学生,使用现有班级或创建新班级,然后创建一个连接学生和班级的连接模型记录。

我想一次性完成所有操作以保存(如果可能的话)。

我试过了:

$data = array(
    'Student' => array(
        '0' => array( ... ), // Data in here
        '1' => array( ... ),
        ...,
        'n' => array( ... )
    ),
    'Class' => array(
        'class_id' => x // The class that I want the above students to be associated with
    )
)

我想要做的是创建 n 条学生记录并将它们添加到一个班级(如果用户想要添加一个新班级,可能同时创建一个班级)。在创建学生记录时,我还想为班级的每个学生创建一个连接模型记录。

这可能吗?我正在使用 Cake 2.1.0(今天的稳定版本),并且我尝试了 $options['deep'] = true 的不同类型的 saveAll(saveAssociated 和 saveMany)。

是否有可能我的数据数组格式不正确?

编辑: 我也试过:

$data = array(
    'ClassStudent' => array(
        '0' => array(
            'Student' => array (...), // Data
            'Class' => array(id => x) // The id of the Class the Student should be associated to
        ...,
        'n' => array(
            'Student' => array(...), // n-th Student
            'Class' => array(id => x)
     )
 );

$this->saveAll($data['ClassStudent'], array('deep' => true));

在上述情况下,它成功地在学生表中创建了新的学生记录,但在连接表中没有创建任何内容。

【问题讨论】:

【参考方案1】:

saveAll(saveAll 是 saveMany 和 saveAssociated 的包装)是适合这项工作的工具。查看saveAll 的文档,我没有看到任何关于它为 2.1 更改的说明。花了更多时间阅读,这里有一些想法

首先,您的数组结构中是否有类型。你有

'Class' => array ( 'class_id' => x )

如果已经定义了班级并且您只想添加一个学生,那么它会是

'ClassStudent' => array( 'class_id' => x )

话虽如此,Cakesphp ORM 应该允许您在使用数字索引的 hasMany 上使用 saveAll,因此如果假设您有错别字,下面可能对您有用

$data = array(
    'Student' => array(
        '0' => array( ... ), // Data in here
        '1' => array( ... ),
        ...,
        'n' => array( ... )
     ),
    'ClassStudent' => array(
        'class_id' => x // The class that I want the above students to be associated with
    )
)
$this->ClassStudent->saveAll($data);

【讨论】:

嗨瑞恩,感谢您的回复。我确实使用了您链接的方法来一次保存一个连接模型并且它有效。但在那种情况下,我只做一个。所以不能一次创建多个join模型? 这实际上比看起来更有趣。经过更多阅读,Cake 文档似乎引起了一些混乱。截至目前,您似乎一次只能保存一组关联,请在 ClassStudent 模型上调用 saveAll 嗨 Ryan,我已经尝试过上述数据格式,但似乎不起作用。至于我的保存调用,不确定是否重要,但在我的 ClassStudent 模型中,我有调用 $this->saveAll($data, array('deep' => true)) 的函数(我已经尝试过并且没有深度)。然后在我的类控制器中,我将该方法称为 $this->Class->ClassStudent->saveClassStudents($this->request->data)。请注意,当我检查数据库时,没有新记录。 我编辑了我的原始帖子以展示我尝试过的其他数据数组结构。

以上是关于CakePHP 2.1 - 保存(和创建)多个连接模型和关联模型的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 2.1 - 模型关联 - 保存和查找

cakePHP 保存到多个模型

Cakephp 多个输入字段

CakePHP 3:上传多个文件并将文件名保存在关联模型中?

Cakephp - 创建记录但没有数据的保存方法

cakephp 3.0 - 保存独特的关联