Laravel跨数据库校验异常:作者检测后$quote始终显示
解决跨数据库校验作者存在性的逻辑问题
问题根源
- 真值判断错误:
get()方法返回的是Eloquent Collection对象,即便没有匹配数据,空Collection在PHP中仍会被判定为true,导致($quotes)的判断永远成立,$author->quotes始终被赋值为链接。 - SQL条件错误:
- 单引号包裹的字符串中PHP变量
{$author->slug}不会被解析,条件实际是匹配包含{$author->slug}字面量的slug; - 使用了HTML实体
",会被SQL解析为双引号,若目标数据库中作者slug不包含双引号,该条件永远无法匹配到数据。
- 单引号包裹的字符串中PHP变量
修正后的代码方案
方案1:使用exists()直接判断存在性(性能更优)
public function show($author) { $author = Author::where('slug', $author)->firstOrFail(); $poems = $author->poems()->get(); // 修正SQL条件,直接判断作者是否存在 $authorExistsInQuotes = DB::connection('quotes') ->table('frasidautore.authors') ->where('slug', 'LIKE', "%{$author->slug}%") ->exists(); $author->quotes = $authorExistsInQuotes ? 'https://www.example.com/authors/' . $author->slug : null; return view('author', compact(['author', 'poems'])); }
方案2:保留集合查询,用isNotEmpty()判断
若需获取匹配记录而非仅判断存在性,可采用此方式:
public function show($author) { $author = Author::where('slug', $author)->firstOrFail(); $poems = $author->poems()->get(); $quotes = DB::connection('quotes') ->table('frasidautore.authors') ->select('slug') ->where('slug', 'LIKE', "%{$author->slug}%") ->get(); $author->quotes = $quotes->isNotEmpty() ? 'https://www.example.com/authors/' . $author->slug : null; return view('author', compact(['author', 'poems'])); }
关键优化说明
- 使用
exists()可直接返回布尔值,无需加载整个数据集,大幅提升查询性能; - 修正LIKE条件:用双引号包裹字符串以正确解析PHP变量,移除不必要的双引号实体(若目标数据库slug确实包含双引号,可保留但需确保变量解析逻辑正确);
- 用
isNotEmpty()替代直接判断集合对象,确保空集合时能正确赋值为null。
内容的提问来源于stack exchange,提问作者wav
相关产品推荐
相关产品推荐

