【问题标题】:CakePHP 3.x update multiple rowsCakePHP 3.x 更新多行
【发布时间】:2018-06-12 01:27:51
【问题描述】:

我有一个表 AssetsAssignations,有数百行。在某些情况下,用户需要用一个复选框选择许多行,然后一起更改所有行的“状态”。

在我的控制器中,我有这个功能

public function editMultiple()
{
    $assetStatuses = $this->AssetsAssignations->AssetStatuses->find('list');
    $this->paginate = [
        'contain' => ['Assets', 'AssetStatuses', 'Clients', 'Rooms'],
        'sortWhitelist' => [
            'Assets.model_number',
            'Assets.serial_number',
            'AssetStatuses.name',
            'Clients.last_name',
            'Rooms.name',
            ]
    ];

    $assetsAssignations = $this->request->data;

    $assetsAssignations_ids = array();

    foreach($assetsAssignations as $a){
        $assetsAssignations_ids[$a['id']] = $a['id'];
        $this->AssetsAssignations->updateAll(

            array('AssetAssignation.id' => $assetsAssignations_ids)
        );
        $this->Session->setFlash(__('Statsus is updated for the selcted entries!'));
    }            
    debug($assetsAssignations);

    $query = $this->AssetsAssignations->find()
        ->contain(['Assets', 'AssetStatuses', 'Clients', 'Rooms']);
    $filter = $this->Filter->prg($query);
    $assetsAssignations = $this->paginate($filter, ['maxLimit' => 10000, 'limit' => 10000]);        

    $this->set(compact('assetsAssignations', 'assetStatuses'));
    $this->set('_serialize', ['assetsAssignations']);
}

在我的 edit_multiple.ctp 中,我使用 javascript 过滤数据。我把这段代码:

<table class="hoverTable dataTable">
        <thead>
                <tr>
                    <th>Select</th><th>Model Number</th><th>Serial Number</th><th>Room</th><th>Client</th><th>Status</th>
                </tr>
        </thead>
        </thead>
                    <?php foreach ($assetsAssignations as $assetsAssignation): ?>
                    <tr>
                        <td><input name="data[AssetsAssignations][id][]" value="<?= $assetsAssignation->id ?>" id="AssetsAssignationsId1" type="checkbox"></td>
                        <td><?= $assetsAssignation->has('asset') ? $assetsAssignation->asset->model_number : '' ?></td>
                        <td><?= $assetsAssignation->has('asset') ? $assetsAssignation->asset->serial_number : '' ?></td>
                        <td><?= $assetsAssignation->has('room') ? $assetsAssignation->room->name : '' ?></td>
                        <td><?= $assetsAssignation->has('client') ? $assetsAssignation->client->last_name . ', ' . $assetsAssignation->client->first_name: '' ?></td>
                        <td><?= $assetsAssignation->has('asset_status') ? $assetsAssignation->asset_status->name : '' ?></td>
                    </tr>
                    <?php endforeach; ?>
    </table>
    <legend><?= __('') ?></legend>
    </div>
        <?= $this->Form->create($assetsAssignation) ?>
    <fieldset>
        <div class="row">
            <div class="col-xs-3"><?= $this->Form->input('asset_status_id', ['options' => $assetStatuses, 'empty' => true, 'label' => __('Change Status To')]) ?></div>
        </div>
    </fieldset>
    <?= $this->Form->button(__('Submit')) ?>
    <?= $this->Form->end() ?>

当我调试结果时,检查 3 个条目,我得到:

[
'data' => [
    'AssetsAssignations' => [
        'id' => [
            (int) 0 => '411',
            (int) 1 => '413',
            (int) 2 => '415'
        ]
    ]
],
'asset_status_id' => '3'

]

我的问题是:选中复选框后如何将选定的行 ID 传递给“提交”按钮?

提前致谢。

【问题讨论】:

  • 将表格放入表单中,带有 ids 的数组将被传递给操作
  • 谢谢阿里利亚。我把表格放在表格里面。但不明白如何在动作中传递 id(我是 cakephp 的初学者)。请问您能提供更多帮助吗?
  • 在您的控制器中尝试打印出 $this->request->data() ,您会看到它包含您的 id 数组。
  • 我在 edit_multiple.ctp 和控制器中更新了我的代码。我添加了调试结果。保存无效
  • 我相信你需要使用'_ids'作为你的数据键,而不是'id'。您的 AssetsAssignations 也应该是 assets_assignations。请参阅手册中的Converting BelongsToMany Data

标签: cakephp-3.0


【解决方案1】:

我认为你想做的事情是这样的

if($this->request->is('post')
{
    $ids = $this->request->data('data.AssetsAssignations.id');
    $asset_status_id = $this->request->data('asset_status_id');

    $this->AssetsAssignations->updateAll(
        ['asset_status_id ' => $asset_status_id ]
        ['id IN' => $ids]
    );

}

【讨论】:

  • 我试过这个:$ids = $this-&gt;request-&gt;data('AssetsAssignations.id'); $asset_status_id = $this-&gt;request-&gt;data('asset_status_id'); $this-&gt;AssetsAssignations-&gt;updateAll( ['asset_status_id ' =&gt; $asset_status_id ], ['id IN' =&gt; $ids] ); 我收到一条错误消息:无法使用字段 (id) 的空值列表生成条件
  • 当然你必须检查你的帖子数据不为空,否则即使没有检查任何id你也会尝试更新。
  • 我仍在为这段代码苦苦挣扎。我把这个:if ($this-&gt;request-&gt;is(['patch', 'post', 'put'])) { $ids = $this-&gt;request-&gt;data('AssetsAssignations.id'); $asset_status_id = $this-&gt;request-&gt;data('asset_status_id'); $this-&gt;AssetsAssignations-&gt;updateAll( ['asset_status_id ' =&gt; $asset_status_id ], ['id IN' =&gt; $ids] ); } debug($ids); 在我的编辑中,当我选择一些复选框时,我总是得到:null as the result in debug($ids)
【解决方案2】:

根据@Arilia 的建议,这对我有用。在我的控制器功能中,我放了这个:

    $this->request->data;
    $data = $this->request->data;
    debug($data);

    if($this->request->is(['patch', 'post', 'put'])) 
    {
        $ids = $this->request->data('data.AssetsAssignations.id');
        $asset_status_id = $this->request->data('asset_status_id');

        $this->AssetsAssignations->updateAll(
            ['asset_status_id ' => $asset_status_id ],
            ['id IN' => $ids]
        );

    }

在我看来,我是这样说的:

<td><input type="checkbox" name="data[AssetsAssignations][id][]" value="<?= $assetsAssignation->id ?>" id="ApplicationId1" ></td>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多