0

以下の MySQL の例のように、CakePHP で結合を実行するにはどうすればよいですか?

SELECT *
FROM yarns y
JOIN yarn_brands yb
JOIN contents ct
WHERE y.id = ct.yarn_id
AND yb.id = y.yarn_brand_id
AND ct.material_id = 2

答えを探してみましたが、うまくいくものは見つかりませんでした。「含む」について何かを見つけました。これを試しましたが、生成されるクエリには、参加するように要求されたテーブルの結合が含まれていないという結果が得られました。

$this->Message->find('all', array(
    'contain' => array('User')
    'conditions' => array(
        'Message.to' => 4
    ),
    'order' => 'Message.datetime DESC'
));
4

2 に答える 2

1

モデルのリレーションシップに関する本を読み、それに応じてモデルとデータベース テーブルを設定していれば、CakePHP を使用するとこれらすべてが非常に簡単になります。これは CakePHP の本当に重要な部分であり、アプリケーションの多くを構成するものです。これを「ケーキ」の方法で行う方法を理解すれば、生活がずっと楽になります。

http://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html#model-and-database-conventions

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

MySQL の例として、このコードを試してください。明らかに、モデルの関係が正確にはわかりませんが、MySQL に基づく推測は次のとおりです。

// app/Model/Yarn.php
class Yarn extends AppModel {

    public $belongsTo = array('YarnBrand');

    // You might need this as $hasOne instead, I can't tell from the MySQL alone.
    public $hasMany = array('Content');

}

// app/Model/YarnBrand.php
class YarnBrand extends AppModel {

    public $hasMany = array('Yarn');

}

// app/Model/Content.php
class Content extends AppModel {

    public $belongsTo = array('Yarn');

}

YarnBrand および Content とともに、すべての Yarn を検索するコード

$this->Yarns->find('all', array(
    'conditions' => array(
        Content.material_id' => 2
    ),
    'contain' => array(
        'YarnBrand',
        'Content'
    )
));
于 2012-12-17T17:45:51.910 に答える
0

これは私が最終的に結合したものです:

            $options['contain'] = '';
            $options['joins'][0]['table'] = 'contents';
            $options['joins'][0]['alias'] = 'cont';
            $options['joins'][0]['conditions'] = 'Yarn.id = cont.yarn_id';
            $options['joins'][1]['table'] = 'yarn_brands';
            $options['joins'][1]['alias'] = 'yb';
            $options['joins'][1]['conditions'] = 'yb.id = Yarn.yarn_brand_id';
            $options['fields'] = array('Yarn.name');
            $options['conditions']['cont.material_id'] = $this->request->data['Yarn']['material_id'];
            $options['conditions']['Yarn.yarn_brand_id'] = $this->request->data['Yarn']['yarn_brand_id'];
于 2012-12-20T09:48:25.713 に答える