0

私はimagesテーブルとテーブルを持っていserversます。テーブル内のフィールドへの外部キーであるimagesフィールドがあります。テーブルには、取得したいフィールドもあります。server_ididserversserversname

これが私のコントローラーアクションコードです:

$images = $this->Image->find('all', array(
    'conditions' => array('Image.user_id' => $this->Auth->user('id')),
    'order' => array('Image.uploaded DESC')
));
$this->set('images', $images);

次のようなデータを取得します。

Array
(
    [0] => Array
        (
            [Image] => Array
                (
                    [id] => 103
                    [orig_name] => Untitled-5.jpg
                    [hash] => MnfWKk
                    [filename] => MnfWKk.jpg
                    [uploaded] => 2012-07-12 00:09:08
                    [views] => 0
                    [album_id] => 
                    [user_id] => 15
                    [server_id] => 1
                )

        )
)

の代わりに、テーブルからフィールドserver_idを取得したいと思います。これを取得するために自分の方法をどのように適応させることができますか?SQL結合であることは知っていますが、サーバー名を取得するためにCakeにSQL結合を実行するように指示する方法がわかりません。nameserversfind()

ありがとう。

4

3 に答える 3

1

TLDR:

CakePHP の関連付けを正しく設定し、CakePHP の Containableを使用します。(再帰-1 を使用)。

詳細な説明:

モデル自体に検索コードを保持するのがベスト プラクティスであるため、それを示しますが、(必要に応じて) 自由にコントローラーに戻してください。

このようにすると、getImages()任意のコントローラーから同じ関数を呼び出すことができ、返されるものに基づいて異なるパラメーターを渡すことができます。このようなコーディングの利点は、クエリ/データベースに関連するコードを探しているかどうか、モデルで探す必要があることを常に知っていることです。あなたのコードを次に見る人が検索する必要がない場合、非常に有益です。

画像とサーバーの間に設定された関連付けにより、画像を照会するときにサーバー情報を「含める」ことができます。ただし、モデルに$actAs = array('Containable');. [ CakePHP Book: コンテイン可能 ]

最後に、AppModel で を設定することをお勧めします$recursive = -1;。これにより-1、すべてのモデルでデフォルトになります。なんらかの理由でこれに反対する場合は、containable を使用するときは常に recursive を -1 に設定してください。そして、containable の使い方を学べば、決して後戻りすることはありません。これは素晴らしいことです。できることはもっとたくさんある

コード:

//AppModel *******
//...
$recursive = -1;
//...

//Images controller *******
//...
public function whatever() {
    $opts = array();
    $opts['user'] = $this->Auth->user('id');
    $images = $this->Image->getImages($opts);
    $this->set(compact('images'));
}
//...


//Image model *******
//...
public $actsAs = array('Containable');

public belongsTo = array('Server');

public function getImages($opts = array()) {

    $params = array('condtions'=>array());

    //specific user
    if(!empty($opts['user'])) {
        array_push($params['conditions'], array('Image.user_id'=>$opts['user']);
    }

    //order
    $params['order'] = 'Image.uploaded DESC';
    if(!empty($opts['order'])) {
        $params['opts'] = $opts['order'];
    }

    //contain
    $params['contain'] = array('Server');

    //returns the data to the controller
    return $this->find('all', $params);
}

その他いくつかの注意事項

  • サーバー モデルでも関連付けを設定する必要があります。
  • 私が示したコード例はかなり冗長に書かれています (それは単語ですか?)。必要に応じて自由に凝縮してください
  • モデルの getImages() メソッドを拡張して、find、limit などのより多くのパラメーターを受け入れることもできます。これを好きなようにカスタマイズしてください-それを行う方法ではありません-私が通常使用するものと同じです。
  • あなたの質問によると、必要なフィールドが 1 つだけの場合は、必要なフィールドを「含む」で指定できます。詳細については、本を参照してください。
  • 今は混乱しているように思えるかもしれませんが、この作業を正しく行う方法を学ぶ価値は十分にあります。そうすれば、生活が楽になります。
于 2012-07-12T00:34:57.880 に答える
0

Cake には、これを実現するための多くのモデル関係があります。このページをチェックしてください。belongsTo 関係を使用していると思います。

于 2012-07-11T23:35:27.127 に答える