1

異なるモデルを同時に検索する最も簡単な方法を探しています。ゲーム、映画、本という 3 つのモデルがあり、1 つのクエリでゲーム、映画、または本のタイトルを検索できるようにしたいと考えています。誰でも簡単な解決策を知っていますか?これはプラグインを使わない簡単な作業ですか?

ありがとう

4

3 に答える 3

2

任意のモデルに以下を含めます (この例ではメディアだとしましょう):

public function search($query) {
    $query = Sanitize::clean($query);
    $result = $this->query("
        (SELECT id, name, 'book' AS type FROM books WHERE name LIKE '%$query%')
        UNION ALL
        (SELECT id, name, 'movie' AS type FROM movies WHERE name LIKE '%$query%')
        UNION ALL
        (SELECT id, name, 'game' AS type FROM games WHERE name LIKE '%$query%')
    ");
    $result = Hash::extract($result, "{n}.{n}");
    return $result;
}

'book' AS type要素の種類を特定する別の方法がある場合は、パーツを削除できます。

App::uses('Sanitize', 'Utility');クラスの前にモデルファイルを追加してください。

メディア コントローラーでは、以下を使用できます。

$result = $this->Media->search($query);

クエリが「ca」の場合、次のようなものが返されます。

array(
    0 => array(
        'id' => '12',
        'name' => 'Carly',
        'type' => 'book'
    ),
    1 => array(
        'id' => '19',
        'name' => 'Camden',
        'type' => 'book'
    ),
    2 => array(
        'id' => '20',
        'name' => 'Carter',
        'type' => 'movie'
    )
);
于 2013-05-09T16:02:22.403 に答える
2

それらの間の関係なしで、1つのfind()ステートメントで?いいえ。

次のようなものを作成できます。

$models = array('Game', 'Movie', 'Book');
$search = 'some title';
$results = array();

foreach($models as $model) {
    $this->loadModel($model);
    $results[$model] = $this->{$model}->find('all', array('conditions' => array($model . '.title' => $search)));
}
于 2013-05-09T00:05:03.773 に答える
2

1 つのモデルにクエリを実行し、次に次のモデルにクエリを実行するだけです。

モデルが互いに関連していない場合、単一のクエリでそれらすべての結果を返す方法はありません。これは、CakePHP ではなく SQL の制限です (編集 - 間違っています! UNION 演算子を使用できます)。そして、1 行で 3 つのモデルを呼び出す方法はまったくありません。

したがって、3 つの個別のクエリを作成し、結果に対して必要なことを行うだけです。それらを個別に表示することも、すべてを 1 つの配列にマージして再ソートし、一緒に表示することもできます。

編集(私の答えがすでに正しいものとして受け入れられた後!):

@xgalvin が述べたように、UNION operatorを使用して 1 つのステートメントで複数のテーブルを結合できます。だから、私は間違っていました。ただし、異なるテーブルが非常に類似していない限り、UNION 演算子は適切ではない可能性が高く、3 つのクエリを作成した方がよいでしょう。必要なのがID、名前、およびタイプだけである場合、@xgalvinの答えは私のものよりも優れています。

于 2013-05-08T23:59:40.573 に答える