为什么这种方法没有输出?

时间:2019-03-20 15:31:58

标签: php laravel

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()}}

在页面上写单词。

3 个答案:

答案 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();