【问题标题】:CakePHP 3 - conditional saving of data in associated tableCakePHP 3 - 有条件地保存关联表中的数据
【发布时间】:2017-03-08 11:49:08
【问题描述】:

我有以下表格:

  • 预订(有一个会话)
  • 会议(有一位来宾工作人员)
  • 客座员工

在我的表单中,我有如下指定的输入字段:

  • 对于 Bookings 相关字段,其表单输入的 ID 为 name 的形式。
  • 对于会话相关的字段,其表单输入的 ID 为 session.name 的形式。
  • 对于宾客员工相关字段,其表单输入的 ID 为 session.gueststaff.name 表单。

但是,并非所有会话都有访客员工,因此我只想为访客员工创建一个 newEntity 并将数据保存到提交时,前提是他们的字段已填写。目前,当我尝试提交时填写访客员工输入在,保存工作正常。但是,当我尝试在未填写任何访客员工输入的情况下提交表单时,保存失败。

控制器中 $save 的调试只给了我这个:false,这不是很有帮助。

查看POST数据,Guest Staff数组是这样的形式(基本为空):

Guest Staff {
    firstname: 
    lastname:    
}

然后我尝试删除 MySQL 中的 Not Null 要求,然后重新 Cake Bake Guest Staff 模型。但是,当我在此之后尝试重新提交表单时,虽然表单能够保存,但仍在 Guest Staff 表中创建了一个新数据条目,其中只有一个 ID 和将其连接到 Sessions 的外键,而另一个字段是空白的,这不是我想要的,因为这意味着该表中会有很多无用的数据条目。

更新:根据 Manohar Khadka 的建议,我添加了一个 if 语句并取消设置。

目前在控制器中:

public function add()
    {
        if ($this->request->is('post')) {
            $data = $this->request->data;
            if(empty($data['session']['gueststaff']['firstname'])){
                unset($data['session']['gueststaff']);
                $booking = $this->Bookings->newEntity([
                    'associated' => [
                        'Sessions'
                    ]
                ]);
            } else {
                $booking = $this->Bookings->newEntity([
                    'associated' => [
                        'Sessions', 'Sessions.Gueststaff'
                    ]
                ]);
            }
            $booking = $this->Bookings->patchEntity($booking, $data, [
                'associated' => [
                    'Sessions', 'Sessions.Gueststaff'
                ]
            ]);
            $save = $this->Bookings->save($booking);
            if ($save) {
                $this->Flash->success(__('The booking was successfully completed.'));
                return $this->redirect(['controller' => 'bookings', 'action' => 'index']);
            } else {
                $this->Flash->error(__('Unfortunately, the booking could not be completed. Please try again.'));
            }
        }
    }

还有我的表格:

<?= $this->Form->create($booking) ?>
<legend><?= __('Session Details') ?></legend>
<?= $this->Form->input('session.location', ['class' => 'form-control']); ?>
<?= $this->Form->input('session.date', ['class' => 'form-control']); ?>                     

<h6>Warning: Fill in the following Guest Staff details if a Guest Staff member will be present.</h6>
<?= $this->Form->input('session.gueststaff.firstname', ['class' => 'form-control']); ?>
<?= $this->Form->input('session.gueststaff.lastname', ['class' => 'form-control']); ?>

<?= $this->Form->button('<strong>' . __('Complete Session Details') . '</strong>', ['id' => 'submit', 'class' => 'btn btn-primary']); ?>

<?= $this->Form->end() ?>

【问题讨论】:

  • 我尝试了同样的方法,没有查看,并选择在另一个表单上添加可选数据,但是您可以在编辑和添加方法中检查它们,使用 $this->request->data 然后您可以取消设置如果实体为空(在 patchEntity 之前),则为实体。

标签: mysql forms cakephp associations cakephp-3.0


【解决方案1】:

也许你可以通过Callbacks 方法更好地处理这些事情,比如 beforeSave。

或者您可以在保存方法中简单地检查字段是否为空,例如:

public function add()
{
    $booking = $this->Bookings->newEntity();
    if ($this->request->is('post')) {
        $data = $this->request->data;
        if(empty($data['session']['gueststaff']['firstname'])){
            unset($data['session']['gueststaff']);
            $booking = $this->Bookings->patchEntity($booking, $data, [
                'associated' => [
                    'Sessions'
                ]
            ]);
        } else {
            $booking = $this->Bookings->patchEntity($booking, $data, [
                'associated' => [
                    'Sessions', 'Sessions.Gueststaff'
                ]
            ]);
        }
        $save = $this->Bookings->save($booking);
        if ($save) {
            $this->Flash->success(__('The booking was successfully completed.'));
            return $this->redirect(['controller' => 'bookings', 'action' => 'index']);
        } else {
            $this->Flash->error(__('Unfortunately, the booking could not be completed. Please try again.'));
        }
       // $this->set(compact('booking'));
    }
}

在进行上述逻辑时,我想输入字段名称如下:

<?= $this->Form->input('gueststaff.fname');?> //<input type="text" name="gueststaff[fname]">
<?= $this->Form->input('gueststaff.lname');?>

如果您愿意,您可以从客户端执行这些操作。

【讨论】:

  • 当我在$this-&gt;request-&gt;is('post') 之后创建newEntity 时,在视图本身上它说$booking 是未定义的。在我看来,$this-&gt;Form-&gt;create($booking) 是表单的开头,$booking 指的是在 POST 之前创建的 newEntity。由于newEntity 的创建在 POST 之后移动,我现在应该如何引用 $booking?
  • 如果你用你的表单和保存方法更新你的问题会更清楚。
  • 已将其添加到 OP。
  • 事情看起来不错..我已经处理了一些小事情..请查看更新的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 2016-04-10
  • 1970-01-01
相关资源
最近更新 更多