2017-08-23 12 views
0

次のクエリをkohanaのORMに変換するのは難しいです。だから、KohanaのORMを使用したMySqlクエリビルド

、私は次の操作を実行している場合は正常に動作します:

$query = DB::query(Database::SELECT, 'SELECT id_book, MATCH(title, author, isbn) AGAINST (:str) AS score FROM tab_books WHERE status = 1 AND MATCH(title, author, isbn) AGAINST (:str) HAVING score > '.$score.' ORDER BY score DESC LIMIT 100'); 

しかし、私は特定のクラスモデルを使用する必要があります。これまでのところ私が持っている:私はスコア値を使用することができないんだということを除いて、正常に動作します

$books = new Model_Book(); 
$books = $books->where('status', '=', 1); 
$books = $books->where(DB::expr('MATCH(`title`,`author`,`isbn`)'), 'AGAINST', DB::expr("(:str)"))->param(':str', $search_terms); 

。テーブルエンジンをInnoDBに変更したため、2番目のクエリが多くの結果を返すため、スコアが必要です。ここ

ORM:https://github.com/kohana/orm/blob/3.3/master/classes/Kohana/ORM.php

はお時間をいただき、ありがとうございます。

答えて

1

したがって、query builderではなく、ORM object findingを使用します。 最初の場合、オブジェクトの2番目の配列で結果配列を取得します。

私を信じて、あなたはリストオブジェクトを使用したくありません。クエリのテストのための

$sq = DB::expr('MATCH(title, author, isbn) AGAINST (:str) AS score') 
     ->param(":str", $search_terms); 
$wq = DB::expr('MATCH(title, author, isbn)'); 
$query = DB::select('id_book', $sq) 
    ->from('tab_books') // OR ->from($this->_table_name) for model method 
    ->where('status','=',1) ->where($wq, 'AGAINST ', $search_terms) 
    ->order_by('score', desc)->limit(100) //->offset(0) 
    ->having('score', '>', $score); 
$result = $query->execute()->as_array(); 

(それは非常に遅いです):

die($query->compile(Database::instance())); 

OT:使用

$books = ORM::factory('Book')->full_text($search_terms, $score); 

代わり$books = new Model_Book();

+0

はbato3ありがとうございます。 – Raphael

関連する問題