6

と呼ばれる仮想フィールドUserを持つと呼ばれるモデルがあります。find()クエリでモデルにアクセスすると、次のような問題なく仮想フィールドに条件を設定できます。full_nameUser

$user = $this->User->find('first', array(
    'recursive' => -1, 
    'conditions' => array(
        'User.full_name' => 'Bruce Thomas'
    )
));

上記のクエリは、BruceThomasというユーザーのデータを正常に返します。しかし、次のようなContainable動作を介して、別のモデルを介してモデルUserを使用しようとすると、問題が発生します。

$user = $this->MyOtherModel->find('first', array(
    'contain' => array('User'),
    'conditions' => array(
        'MyOtherModel.id' => $my_other_model_id
        'User.full_name' => 'Bruce Thomas'
    )
));

(上記の例では、が私のモデルと関係MyOtherModelがあることを前提としています)belongsToMyOtherModel

上記のクエリでは、次のエラーが発生します。

警告(512):SQLエラー:1054:'on句'の不明な列'User.full_name' [CORE \cake \ libs \ model \ datasources \ dbo_source.php、line 681]

私がこれをどのように行うことができるかについて何か助けがありますか?ありがとうございました

4

2 に答える 2

10

最新の CakePHP のドキュメント (v2 以降) によると、これは仮想フィールドの制限です

virtualFields の実装にはいくつかの制限があります。まず、条件、順序、またはフィールド配列の関連付けられたモデルで virtualFields を使用することはできません。これを行うと、フィールドが ORM に置き換えられないため、通常は SQL エラーが発生します。これは、関連付けられたモデルが見つかる深さを推定するのが難しいためです。この実装の問題に対する一般的な回避策は、アクセスする必要がある場合に、実行時に virtualFields をあるモデルから別のモデルにコピーすることです。

$this->virtualFields['name'] = $this->Author->virtualFields['name'];

また

$this->virtualFields += $this->Author->virtualFields;

詳細はこちら: http://book.cakephp.org/2.0/en/models/virtual-fields.html - 彼らが提案するオプションの実装を計画している場合 (私にはまったく問題ないように見えます)、ぜひご覧ください。 「仮想フィールドとモデル エイリアス」セクションで、フィールド名の衝突を回避します (つまりfull_name、2 つのモデルで呼び出されたフィールドがあり、両方を使用するクエリを発行しようとすると、あいまいなフィールド SQL エラーが発生します。これはエイリアスで回避されます)。 )。

于 2013-02-27T21:46:23.723 に答える
1

モデルでは、以下のコードを使用して仮想フィールドを作成する必要があります:

public $virtualFields = array(
    'full_name' => 'CONCAT(YourModelName.first_name, " ", YourModelName.last_name)'

);

ここで、コントローラーの条件配列内で以下のコードを呼び出すだけです。

$condition=array($this->YourModelName->virtualFields['your_virtual_field_name'].' LIKE "%'.$YourSearchKeyword.'%"');
于 2015-05-08T07:29:25.570 に答える