0

ユーザーとエンティティの2つのモデルがあります。エンティティページで、ページネーションと簡単な検索機能を使用する必要があります。検索関数はエンティティをフィルタリングしますが、フィルタリングするデータはユーザーモデル内のvirtualFieldです。

エンティティモデル:

public $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
 };

ユーザーモデルの仮想フィールド:

 public $virtualFields = array("searchFor" => "CONCAT(User.first_name, ' ',User.last_name, ' ',User.email)");

そして、エンティティコントローラー内の条件:

 $conditions["User.searchFor LIKE"] = "%".str_replace(" ","%",$this->passedArgs["searchFor"])."%";
 $this->paginate = array(
                'conditions' => $conditions,
                'order' => array('Re.created' => 'DESC'),
                'limit' => 20
            );

連想モデルのクエリ内でvirtualFieldsを使用できず、「ランタイム」で使用する必要があると書かれているため、これを読み取ることはできませんが、その方法や方法がよくわかりません。この場合はそれ。これを機能させるためのアイデアや方法はありますか?

4

2 に答える 2

0

この目的のために、関連するモデルから連結された文字列を検索する必要がありました。通常、これはcakeのVirtualfieldsを使用して実行できますが、cakeは、検索で関連付けられたモデルからのvirtualFieldの使用をサポートしていません。

2つのモデルがすでにbelongsToにリンクされているのを見て、条件を次のように変更しただけです。

 "conditions" => "CONCAT(User.first_name, ' ',User.last_name, ' ',User.email) LIKE" => "%".str_replace(" ","%",$this->passedArgs["searchFor"])."%"

おそらく最もエレガントなソリューションではありませんが、機能します。

于 2012-05-14T13:36:56.103 に答える
0

次のように、virtualField を Entity モデルにアタッチしてみてください。

$this->Entity->virtualFields['searchFor'] = $this->Entity->User->virtualFields['searchFor'];

ただし、2 つのクエリではなく、結合が行われていることを確認する必要があります。

本で議論されていると思います。

編集:本のページ

于 2012-05-09T14:44:16.423 に答える