1

私は CakePHP 2.0 で約 1 か月作業していますが、今日、find() の hasMany 関係に問題があることがわかりました。

モデル Usuario (ユーザー) の関係は次のとおりです。

$this->Usuario->bindModel(array(
'hasMany' => array(
    'CambioCorreo' => array(
        'className' => 'CambioCorreo',
        'foreignKey' => 'id_usuario',
    ),
    'Llave' => array(
        'className' => 'Llave',
        'foreignKey' => 'id_usuario',
    ))));

しかし、この検索を使用しようとすると:

$u = $this->Usuario->find('all',array('conditions' => array('Llave.llave' => $llave,'Llave.id_tipo_llave' => 3,'Llave.fecha_creacion = CambioCorreo.fecha')));

、 私はこれを得た:

エラー: SQLSTATE[42S22]: 列が見つかりません: 1054 不明な列 'Llave.llave' が 'where 句' にあります

奇妙なことに、hasMany リレーションシップを実行する前に、hasOne を間違いとして実行しましたが、かなりうまく機能しました。しかし今、bindModel を「hasOne」から「hasMany」に変更したところ、SQL 列エラーが発生しました。

私がどこで間違いを犯しているのか誰にも分かりますか?

前もって感謝します

4

1 に答える 1

3

hasMany リレーションシップは、同じ SQL ステートメント内で LEFT 結合されていないため、同じステートメント内で条件を使用することはできません。同じことがHABTMにも当てはまります。

ただし、Usuario 検索で得られる hasMany アイテムに条件を追加することはできます。

$this->Usuario->find('all', array(
  'contain' => array(
    'Llave' => array(
      'conditions' => array(
        'Llave.llave' => $llave
      )
     )
   )
));

これにより、すべての Usuario レコードが検索され、すべての Llave レコードが取り込まれますllave => $llave

プロセスは次のようなものです。Cake は SQL ステートメントを作成してすべての Usuario レコードを検索し、各 Usuario レコードに対して個別の SQL ステートメントを作成して、上記の条件でそれぞれの Llave レコードをプルします。次に、それらを 1 つの配列に結合します。

Llave の条件に基づいて Usuario レコードを見つけるには、条件を使用してフィルター処理できるように hasOne リレーションシップをバインドするか、最初に Llave レコードを検索して、次のような Usuario レコードを含める必要があります。

$this->Usuario->Llave->find('all', array(
  'conditions' => array(
    'Llave.llave' => $llave
  ),
  'contain' => array(
    'Usuario'
  )
));

これにより、Llave レコードが検索され、それぞれのユーザーが結合されます。ただし、複数の Llave を持つことができるため、Usuario レコードが重複する可能性があります。

于 2012-04-23T18:02:26.550 に答える