CakePHP 3在两个表

时间:2017-01-30 11:40:15

标签: mysql cakephp save associations cakephp-3.0

更新:从表单输入中删除0,从会话中删除s,同时还将预订hasMany Sessions的关系更改为Booking hasOne Session。

所以我有4个与此相关的表:

  • 预订(带有输入字段的表单来自)
  • 会话(链接到预订)
  • Sessionplayers_sessions(在Sessionplayers& Sessions之间加入表格)
  • Sessionplayers

使用我的表单时,我会尝试保存预订,会话和& Sessionplayer_sessions。下面的表单输入是Sessionplayer_sessions的唯一相关字段:

<?php echo $this->Form->input('session.sessionplayers._ids', ['type' => 'select', 'options'=>'','multiple']); ?>

表单输入中的选项显示为空白,来自双列表jQuery脚本,允许选择多个项目。

然而,当我尝试保存时,上述输入中的任何内容实际上都没有发布到Sessionplayer_sessions表中,而Bookings&amp;会话已成功发布。

在Controller中,这就是newEntity&amp; patchEntity部分如下所示:

$booking = $this->Bookings->newEntity($this->request->data(),[
        'associated'=>[
          'Sessions' => ['associated' => ['Guestengineers', 'Sessionplayers']]
      ]]);
      if($this->request->is('post')){
        $data = $this->request->data;
        $booking = $this->Bookings->patchEntity($booking, $data, [
          'associated'=>[
            'Sessions' => ['associated' => ['Guestengineers', 'Sessionplayers']]
          ]
        ]);

Sessions和Sessionplayers表的相应模型:

会话:

public function initialize(array $config)
{
    parent::initialize($config);

    $this->table('sessions');
    $this->displayField('id');
    $this->primaryKey('id');

    $this->addBehavior('Timestamp');

    $this->belongstoMany('Sessionplayers', [
        'foreignKey' => 'session_id',
        'targetForeignKey' => 'sessionplayer_id',
        'joinTable' => 'Sessionplayers_sessions'
    ]);
}

Sessionplayers:

public function initialize(array $config)
{
    parent::initialize($config);

    $this->table('sessionplayers');
    $this->displayField('id');
    $this->primaryKey('id');

    $this->addBehavior('Timestamp');

    $this->belongstoMany('Sessions', [
        'foreignKey' => 'sessionplayer_id',
        'targetForeignKey' => 'session_id',
        'joinTable' => 'Sessionplayers_sessions'
    ]);
}

结果:

更新表格输入和预订与安排之间的关系。会话表并重新提交:

在帖子数据中,会话播放器现在是会话数组中的一个数组。在sessionplayers数组中有一个属性:_ids,其值引用在表单输入的多重选择中选择的第一个会话播放器的id - 例如,如果我选择了第3个会话播放器和第4个会话播放器,则_ids = 3。 ,在数据库本身,虽然能够成功插入预订和会话表数据,但sessionplayers_session的表却没有。

基本上:请求数据数组如下:Session(array) - &gt; Sessionplayers(数组) - &gt; _ids = 3。

在SQL日志中,只发生了两个Insert Into SQL语句,一个用于预订,一个用于会话。 Sessionplayers_sessions没有这样的插入。

1 个答案:

答案 0 :(得分:-1)

我认为在从表单输入中删除0并将关系从OneToMany更改为OneToOne后,我设法修复了它,通过在[]中添加来表示可能有多个项目被选中。