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適切に動作します。

2 つ目は、リードとスパム テーブルを照合するのにこれが最善の方法ですか? スパム テーブルが大きくなるにつれて、何百もの where 句が存在する可能性があります。より良い戦略はありますか?

4

3 に答える 3

0

ifステートメントの2番目の部分にある「ANDWHERE」を削除して、「AND」だけに置き換えます。

問題(エラーメッセージなど)について詳しく知らなくても、これが最も明白な構文の問題のようです。

編集:より大きな質問に答えるために、私はこれがそれを行うための最良の方法ではないと思います。専門家にその部分を当ててもらいますが、おそらくすべてのレコードとすべてのスパムルールをロードし、DBクエリの後にフィルタリングを実行します。SQLは全文検索、IMEには向いていません。

于 2013-02-04T23:19:17.290 に答える
0

私はあなたができるとは思わない:

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

それを次のように変更してみてください。

DB::raw($sm);

また、SQL ステートメントに二重引用符が含まれているのはなぜですか?

于 2013-02-04T23:47:12.917 に答える
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 に答える