異なるモデルを同時に検索する最も簡単な方法を探しています。ゲーム、映画、本という 3 つのモデルがあり、1 つのクエリでゲーム、映画、または本のタイトルを検索できるようにしたいと考えています。誰でも簡単な解決策を知っていますか?これはプラグインを使わない簡単な作業ですか?
ありがとう
異なるモデルを同時に検索する最も簡単な方法を探しています。ゲーム、映画、本という 3 つのモデルがあり、1 つのクエリでゲーム、映画、または本のタイトルを検索できるようにしたいと考えています。誰でも簡単な解決策を知っていますか?これはプラグインを使わない簡単な作業ですか?
ありがとう
任意のモデルに以下を含めます (この例ではメディアだとしましょう):
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'
)
);
それらの間の関係なしで、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)));
}
1 つのモデルにクエリを実行し、次に次のモデルにクエリを実行するだけです。
モデルが互いに関連していない場合、単一のクエリでそれらすべての結果を返す方法はありません。これは、CakePHP ではなく SQL の制限です (編集 - 間違っています! UNION 演算子を使用できます)。そして、1 行で 3 つのモデルを呼び出す方法はまったくありません。
したがって、3 つの個別のクエリを作成し、結果に対して必要なことを行うだけです。それらを個別に表示することも、すべてを 1 つの配列にマージして再ソートし、一緒に表示することもできます。
編集(私の答えがすでに正しいものとして受け入れられた後!):
@xgalvin が述べたように、UNION operatorを使用して 1 つのステートメントで複数のテーブルを結合できます。だから、私は間違っていました。ただし、異なるテーブルが非常に類似していない限り、UNION 演算子は適切ではない可能性が高く、3 つのクエリを作成した方がよいでしょう。必要なのがID、名前、およびタイプだけである場合、@xgalvinの答えは私のものよりも優れています。