在这一点上把我的头发扯掉,希望有人能帮我!
我在Yii2上使用Kartik-V Typeahead Advanced小部件。
插件的工作原理是,功能在页面上运行得很好,我搜索,结果显示在自动完成列表中。
很遗憾,我无法将结果存储在我的数据库中。我在以下线路上看到一个问题:
->where([ 'name' => $model->name ])//This variable is returning null
我是否试图错误地存储数据?我已经尝试了我能想到的一切,但我相信这里有人会想出更好的办法!
请参阅下面的完整代码
我的控制器:
public function actionIndex()
{
$model = new Member();
if ($model->load(Yii::$app->request->post())) {
$test = Test::find()
->where([ 'name' => $model->name ])//This variable is returning null
->one();
$test->updateCounters(['times_used' => 1]);
}
return $this->render('index', [
'model' => $model,
]);
}
/*************
* Initial prefetch of results
*************/
public function actionPrefetchlist() {
$query = new Query;
$query->select('name')
->from('test_table')
->limit(10)
->orderBy('times_used');
$command = $query->createCommand();
$data = $command->queryAll();
$out = [];
foreach ($data as $d) {
$out[] = ['value' => $d['name']];
}
echo Json::encode($out);
}
/*************
* Remote results
*************/
public function actionRemotelist() {
$query = new Query;
$query->select('name')
->from('test_table')
->where('name LIKE "%' . $q .'%"')
->limit(10)
->orderBy('times_used');
$command = $query->createCommand();
$data = $command->queryAll();
$out = [];
foreach ($data as $d) {
$out[] = ['value' => $d['name']];
}
echo Json::encode($out);
}
视图文件:
echo $form->field($model, 'name')->label(false)->widget(Typeahead::classname(), [
'name' => 'name',
'options' => ['placeholder' => 'Filter as you type ...'],
'pluginOptions' => ['highlight'=>true],
'dataset' => [
[
'datumTokenizer' => "Bloodhound.tokenizers.obj.whitespace('value')",
'display' => 'value',
'prefetch' => Url::to(['prefetchlist']),
'remote' => [
'url' => Url::to(['remotelist']) . '?q=%QUERY',
'wildcard' => '%QUERY'
]
]
]
]);
您在这里要求一个新模型:
$model = new Member();
所以你得到了一个空模型因此$model->name
为空如果设置型号$model->name='test';
因此,首先填充模型
所以这是一个巨大的新手错误。
如果其他人偶然发现了类似的东西,我从模型的"rules()"中删除了属性name
我在数据库中需要一个整数,但我希望用户在字符串中输入(然后我会在控制器中转换它)。把它从规则中删除破坏了一切。
希望这能帮助其他人:)