0

我有一张桌子,里面满是想和我们做生意的人的线索。我还有一张垃圾邮件术语表。我需要过滤来自潜在客户的垃圾邮件。我在 Laravel 4 中这样做。我在想这样的事情:

$spam_terms = SpamTerms::all();

$sm = '"SELECT * FROM all_forms_send_message';
foreach ($spam_terms as $spam) {
    if ($spam->id == 1) {
            $sm .= ' WHERE GeneralNotes NOT LIKE ' . $spam->term  . ' ';
    } else {
            $sm .= ' AND WHERE GeneralNotes NOT LIKE ' . $spam->term  . ' ';
    }
}
$sm .= '"';
// echo $sm;
return DB::select(DB::raw($sm));

首先,这是行不通的。它在最后一行引发错误。该语句构建得很好并且echo正确。

其次,这是将线索与垃圾邮件表匹配的最佳方式吗?随着垃圾邮件表的增长,可能会有数百个 where 子句。有更好的策略吗?

4

3 回答 3

0

警告:前面有未经测试的代码...

如果您要使用查询生成器,请在整个过程中使用它。

$query = DB::table('all_forms_send_message);
foreach ($spam_terms as $spam) {
    $query = $query->where('GeneralNotes','like',"%".$spam->term."%");
}
return $query->get();

看到所有数据库方法“未链接”有点不寻常,但它们以这种方式工作得很好。在这里,您要选择表,添加所有 where 子句,最后告诉查询运行。

于 2013-02-14T20:24:22.607 回答
0

我会去掉 if 语句第二部分中的“AND WHERE”,并用“AND”替换它

在不了解该问题的更多信息(例如错误消息)的情况下,这似乎是最明显的语法问题。

编辑:要回答更大的问题,我认为这不是最好的方法。我会让专家来讨论这部分,但我可能会加载所有记录和所有垃圾邮件规则,并在数据库查询之后进行过滤。SQL 不擅长全文搜索、IME。

于 2013-02-04T23:19:17.290 回答
0

我认为你不能这样做:

DB::select(DB::raw($sm));

尝试将其更改为:

DB::raw($sm);

另外,为什么你的sql语句中有双引号?

于 2013-02-04T23:47:12.917 回答