如果我使用 select2 小部件,如何发布表中记录的实际主键而不是 php Yii2 中的数组索引?

Posted

技术标签:

【中文标题】如果我使用 select2 小部件,如何发布表中记录的实际主键而不是 php Yii2 中的数组索引?【英文标题】:How to post actual primary keys of records from table and not indexes of an array in php Yii2 if I use select2 widget? 【发布时间】:2021-09-14 10:02:44 【问题描述】:

我的控制器内部功能如下:

public function actionProjects($id)
    
        $model = $this->findModel($id);
        $projects = Project::find()->all();
        $projectIds = Yii::$app->request->post('projects');
        if (Yii::$app->request->isPost) 
            Yii::$app->session->setFlash('success');
            $model->unlinkAll('projects');
            if ($projectIds) 
                foreach ($projectIds as $projectId) 
                    $project = Project::findOne(abs((int)$projectId));
                    if ($project) 
                        $model->link('projects', $project);
                    
                
            
        
        print_r($projectIds);
        return $this->render('projects', ['projects' => $projects, 'model' => $model]);
    

我的看法如下:

<?php
...
function sortArray($a, $b)

    return strcmp($a, $b);


$projects = ArrayHelper::map($projects, 'id', 'title');
usort($projects, 'sortArray');
?>
<div class="application-create x_panel">

    <div class="x_title"><h3><?= html::encode($this->title) ?></h3></div>

    <div class="x_content">
        <?php $form = ActiveForm::begin(); ?>
        <div class="form-group">
            <?= Select2::widget([
                'name' => 'projects[]',
                'options' => ['placeholder' => 'Выберите проект...'],
                'language' => 'ru',
                'value' => array_keys(ArrayHelper::map($model->projects, 'id', 'title')),
                'data' => $projects,
                'pluginOptions' => [
                    'allowClear' => true,
                    'multiple' => true
                ],
            ]) ?>
        </div>
        <div class="form-group">
            <?= Html::submitButton('Обновить', ['class' => 'btn btn-primary']) ?>
        </div>
        <?php ActiveForm::end() ?>
    </div>

</div>

当我从 select2 中选择单个或多个项目,然后单击更新按钮 - 此代码:

$projectIds = Yii::$app->request->post('projects');

这样的帖子数组:Array ( [0] =&gt; 0 [1] =&gt; 1 [2] =&gt; 2 )

发送到服务器的数据是项目的索引数组,而不是表中的实际索引(主键)。 (我在 db 表中有 3 个项目 - 它们的索引是 5,6 和 7)

如何发送选中项的主键?我找不到导致我的问题的隐藏老鼠。似乎代码中的一切都是正确的。但实际上不是。

【问题讨论】:

【参考方案1】:

问题出在usort() 电话中。该函数会删除 $projects 数组中的索引。您必须改用 uasort(),它旨在维护关联数组中的索引。

【讨论】:

以上是关于如果我使用 select2 小部件,如何发布表中记录的实际主键而不是 php Yii2 中的数组索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Yii 2.0.43 版和 bootstrap4 中启用 select2 小部件的搜索控件

如何使用 select2 小部件 yii 制作依赖下拉列表

如何获取 yii2 select2 小部件的选定选项的值

如何在 yii2 中使用 select2 小部件选择多个值

Yii2. Kartik Select2 小部件宽度

在 Yii2 Kartik Select2 小部件中,如何对选择事件进行 ajax 调用?