如果我使用 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 中的数组索引?的主要内容,如果未能解决你的问题,请参考以下文章