private function getWord()
{
$words = DB::select('select "name" from words');
$word = $words[array_rand($words)];
if ($this->gamedata->getUsedWords() !== null) {
foreach ($this->gamedata->getUsedWords() as $usedWord) {
if ($usedWord == $word) {
return getWord();
}
}
}
$this->gamedata->addUsedWord($word);
return $word;
}
此方法以某种方式确实给了我一个空的“ $ word”。至少它不是字符串。 在表中的单词我有1个条目,方法“ getUsedWords()”只是用来检查我之前是否使用过该单词。 我只想从表中获得1个随机词,而以前没有使用过。 如果我想在我的视图中读取此输出,则会收到错误消息:“ htmlspecialchars()期望参数1为字符串”
我将此值保存在“ GameData”类中。
$this->gamedata->setWord($this->getWord());
这种方法看起来像这样:
public function setWord($word)
{
$this->word = $word;
}
在我看来,我使用:
{{$gamedata->getWord()}}
在页面上写单词。
答案 0 :(得分:0)
我什至不尝试解释代码次优的许多方式,我只是建议您将其重写为:
private function getWord()
{
$word = \DB::table('words')
->when(!empty($this->getUsedWords()), function ($query) {
$query->whereNotIn('word', $this->getUsedWords());
})->inRandomOrder()
->value('word')
$this->gamedata->addUsedWord($word);
return $word;
}
换句话说,从表words
中以随机顺序获取第一个元素,如果使用的单词不为空,则排除这些单词。
答案 1 :(得分:0)
我不会完全使用该函数来返回以前未使用过的单词,因为每次调用该函数时,您将返回所有单词,然后对其进行解析,然后调用数据库查询每次。
我将有一个表,其中包含单词列表,然后每个单词旁边都有用法计数。由于您不必为使用哪个词而烦恼,只要提供它之前从未使用过的词,我将构造一个SELECT语句,该语句将选择第一个结果,并按使用率递增的顺序进行排序。这样,一旦使用完所有单词,它就会发生,然后循环遍历并重新开始。
答案 2 :(得分:-1)
不要在select内写入select语句。只需少量访问文档,您就会知道它应该是:
$words = DB::table('words')->select('name')->get();