查询生成器:在哪里不添加单引号?

时间:2017-03-17 15:37:47

标签: php laravel

我正在尝试使用Laravel查询构建器实现相当复杂的SQL查询,我相信我可能遇到了一个错误。我想首先确认你的情况。

这是错误的代码:

public function getWordTranslations($word) {
    if (strpos($word, '*') === false) {
        $word .= '%';
    } else {
        $word = str_replace('*', '%', $word);
    }

    return $this->createTranslationQuery()
        ->whereIn('t.NamespaceID', function ($query) use($word) {

            $tertiaryMatches = DB::table('keywords as k')
                ->join('translation as t', 'k.TranslationID', '=', 't.TranslationID')
                ->where('k.NormalizedKeyword', 'like', $word)
                ->where('t.Deleted', '=', 0)
                ->whereNotNull('k.TranslationID')
                ->select('t.NamespaceID');

            $query->select('NamespaceID')
                ->from('keywords')
                ->where('NormalizedKeyword', 'like', $word)
                ->whereNotNull('NamespaceID')
                ->union($tertiaryMatches);

        })->get();
}

createTranslationQuery使用DB创建查询构建器对象。我想用IN子查询过滤原始查询。

不幸的是,whereIn构建器生成的子查询用单引号包装$word所持有的值。

$word = "sample"时的预期结果:

select ... where t.NamespaceID in(
   select NamespaceID 
   from ...
   where NormalizedKeyword like 'sample%'
   ...)

实际结果:

select ... where t.NamespaceID in(
   select NamespaceID 
   from ...
   where NormalizedKeyword like sample%
   ...)

=重大破损。

这是个例外(对于缺少格式化而道歉!):

  

SQLSTATE [42000]:语法错误或访问冲突:1064您有   SQL语法错误;查看与您的手册相对应的手册   MySQL服务器版本,用于在' union附近使用正确的语法(选择   来自t的{​​{1}} NamespaceID keywords内部加入k'在   第1行(SQL:选择translationwKeyWordt,   TranslationIDtTranslationtEtymologytTypet,   SourcetCommentstTengwartPhoneticl as   NameLanguagetNamespaceIDlInvented,   LanguageInventedtAuthorIDaNicknameAuthorNamew,   NormalizedKeytIndextDateCreatedtTranslationGroupIDtg   作为NameTranslationGrouptgCanontg,   ExternalLinkFormattUncertaint来自ExternalID作为translation内部联接   t上的wordwt = WordIDw内部加入KeyID为   language上的lt = LanguageIDlID加入auth_accounts作为a   tAuthorID = aAccountID离开加入translation_group作为tg   在tTranslationGroupID = tgTranslationGroupID其中   (tLatest = 1和tDeleted = 0)和tNamespaceID in   ((从NamespaceIDkeywords选择NormalizedKeyword   laiquendi%和NamespaceID不为null)union(选择   来自t的{​​{1}}。NamespaceID keywords内部加入k   translation上的tk = TranslationIDt其中   TranslationIDk喜欢laiquendi%和NormalizedKeywordt = 0和   Deletedk不为null)))

这是一个错误,还是我做错了什么?

编辑#1
如果我删除了union指令,那么查询就会起作用,所以我怀疑是因为我使用了与TranslationID方法提供的查询构建器不同的查询构建器而出现错误。

1 个答案:

答案 0 :(得分:0)

我简化了我的解决方案。避免复杂性再次成功的关键。