我正在尝试使用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:选择translation
。w
为Key
,Word
。t
,TranslationID
。t
,Translation
。t
,Etymology
。t
,Type
。t
,Source
。t
,Comments
。t
,Tengwar
。t
,Phonetic
。l
asName
,Language
。t
,NamespaceID
。l
为Invented
,LanguageInvented
。t
,AuthorID
。a
为Nickname
,AuthorName
。w
,NormalizedKey
。t
,Index
。t
,DateCreated
。t
,TranslationGroupID
。tg
作为Name
,TranslationGroup
。tg
,Canon
。tg
,ExternalLinkFormat
。t
,Uncertain
。t
来自ExternalID
作为translation
内部联接t
上的word
为w
。t
=WordID
。w
内部加入KeyID
为language
上的l
。t
=LanguageID
。l
将ID
加入auth_accounts
作为a
t
。AuthorID
=a
。AccountID
离开加入translation_group
作为tg
在t
。TranslationGroupID
=tg
。TranslationGroupID
其中 (t
。Latest
= 1和t
。Deleted
= 0)和t
。NamespaceID
in ((从NamespaceID
中keywords
选择NormalizedKeyword
laiquendi%和NamespaceID
不为null)union(选择 来自t
的{{1}}。NamespaceID
keywords
内部加入k
translation
上的t
。k
=TranslationID
。t
其中TranslationID
。k
喜欢laiquendi%和NormalizedKeyword
。t
= 0和Deleted
。k
不为null)))
这是一个错误,还是我做错了什么?
编辑#1
如果我删除了union指令,那么查询就会起作用,所以我怀疑是因为我使用了与TranslationID
方法提供的查询构建器不同的查询构建器而出现错误。
答案 0 :(得分:0)
我简化了我的解决方案。避免复杂性再次成功的关键。