0

Cakephp 2.3.2 を使用しており、複数のテーブルに対してクエリを実行する必要があります。

私はこのデータベースを持っています:

--------------------------------------------------------------
|    Users     |    Agents     |    Companies    |    Ads    |
--------------------------------------------------------------
|      id      |      id       |       id        |    id     |
|    username  |      name     |     company     |   title   |
|    password  |    lastname   |      sector     |  message  |
|              |     user_id   |     user_id     |  user_id  |
--------------------------------------------------------------

これらは関連付け (モデル) です。

ユーザー

  • hasOneエージェント
  • ハスワンカンパニー
  • hasMany 広告

エージェント

  • 所属するユーザー

会社

  • 所属するユーザー

広告

  • 所属するユーザー

注: 新しいユーザーを追加するとき、そのユーザーはエージェントまたは会社である可能性があることに注意してください。)

質問:

私のAdsControllerには、 viewという名前のアクションがあり、Route から受け取る 2 つのパラメーターを読み取ります。

$this->params['id']
$this->params['sector']

IDが実際にAd.idに関連付けられているかどうか、およびセクターCompany.sectorに関連付けられているかどうかを確認するクエリを実行する必要があります。

チェックする代わりにONE find('first') でチェックしたい

  1. IDが存在する場合
  2. セクターが存在し、それが user_id に関連付けられている場合

どうすればできますか?

(クエリで Ad.id と Company.sector が見つかった場合、Ad と Company のすべてのフィールドを取得する必要があります)


現時点では、AdsController/viewの find('first' ) は次のとおりです。

$options = array(
    'fields' => array(
        'Ad.*'
    ),
    'contain' => array(
        'User' => array(
            'Company' => array(
                'fields' => array(
                    'Company.*'
                ),
                'conditions' => array(
                    'Company.sector' => $this->params['sector'],
                ),
            )       
        )
    ),
    'conditions' => array(
        'Ad.id' => $this->params['id'],
    )
)

$data = $this->Ad->find('first', $options);
debug($data);

問題は、Companyが結果 (配列) に表示されるようになったことです。

配列 IF を取得するだけでよいことに注意してください。

  • AD の ID が存在する
  • 会社のセクターが存在する

上記のいずれかが「真」でない場合、空の配列を取得したいと思います。

明らかに、Ad モデルに Containable 動作を追加しました。

4

1 に答える 1

0

私はこれを見てきましたが、何らかの理由でそのarray()構造でちょっと誤動作するという同じ問題がありました。おそらくそれが意味するように機能しますが、私はそれを理解していません。とにかく、チェーンの依存関係を取得するには、この種の構造を使用します:

$options = array(
        'contain' => array(
            'User',
            'User.Company' => array(
                'conditions' => array(
                    'Company.sector' => $this->params['sector'],
                ),
            )                   
        ),
        'conditions' => array(
            'Ad.id' => $this->params['id'],
        )
    )

ただし、contain の条件はメイン モデルの条件と同じではないことに注意する必要があります。そのため、会社のセクターが存在しなくても、指定された ID を持つ Ad が終了した場合でも、空のセットを受け取ることはありません。私の知る限り、モデル間に直接的な関連がない場合、条件を使用して結果を除外することはできません。$result['User']['Company']したがって、 が空のセットかどうかを確認する必要があります。

もう1つ、クエリ配列が質問で提供した構造と一致しません。テーブルにフィールドがありsectorませCompany

于 2013-04-09T12:27:34.440 に答える