1

フィールドgp_categoriesに「12 56 34 345 349」という文字列が含まれている場合、34 という数字を含むレコードを見つけるにはどうすればよいですか?

$id = 34;

// 1. Works but is there a more efficient way?
$q['conditions']['OR'] = array(
    array('Groups.gp_categories LIKE' => $id), // Only
    array('Groups.gp_categories LIKE' => $id.' %'), // Start
    array('Groups.gp_categories LIKE' => '% '.$id.' %'), // Middle
    array('Groups.gp_categories LIKE' => '% '.$id) // End
);

// 2. Finds either 34, 345, 349 etc
$q['conditions'] = array('Groups.gp_categories LIKE' => '%'.$id.'%');
4

3 に答える 3

3

データベース側で正規表現を使用します

 $q['conditions'] = array("Groups.gp_categories REGEXP" => "[[:<:]]".$id."[[:>:]]");

(これは mysql です。ところで、別のデータベースを使用している場合は変更する必要があります)。

その検索をモデル関数にラップするか、他の場所で再利用されない場合はコントローラーに残すことができます。

public function getByCategory($id) {
    return $this->find('all', array('conditions'=> 
           array("Groups.gp_categories REGEXP" => "[[:<:]]".$id."[[:>:]]")));
}

//in controller
$this->YourModel->getByCategory($id);

Cake にもっと効率的な機能があるかどうかはわからないので、おそらくノーです。また、DB の正規表現が、既に使用している LIKE クエリよりも効率的かどうかをテストする必要があります。ベンチマークは行っていません。でも4いいねよりは効率がいいはず。

于 2013-07-08T17:48:25.333 に答える
0
Using Locate

LOCATE は次のように機能します。

LOCATE(<string to find>, <string to find it in>)

また

LOCATE(<string to find>, <string to find it in>, <position to start at>)

たとえば、文字列 "apples oranges pearsbananasapplesoranges" 内の "oranges" の場所を見つけるには、次のようにします。

SELECT LOCATE("oranges", "apples oranges pears bananas apples oranges");

これは 8 を返します。ソース文字列で次に出現する「oranges」を見つけるには、3 番目のパラメーターを関数に渡し、この例では位置 9 から開始するように指示します。

SELECT LOCATE("oranges", "apples oranges pears bananas apples oranges", 9);

これで 37 が返されます。これらの例では、開始位置として 8 が渡された場合、8 が返されることに注意してください。

これをさらに使用するには、リンクを参照できます

しかし、それをcakephp配列に変換する必要があるのは、

于 2013-07-08T17:12:37.860 に答える
0

これを試して

   $gp_categories = '12 56 34 345 349' ;
    if (strpos($gp_categories,'34') !== false) {
    echo 'true';
    }
于 2013-07-08T16:52:27.177 に答える