0

私は既存のデータベースを使用しています (変更することはできず、そのテーブル名はケーキの慣習が望んでいるものとは異なります)。左結合をいくつか実行したいのですが、適切に実行できません:/

私はすでにテーブルを定義しており、テーブルに主キーとモデルの関係を与えています。

ここに私の問題があります:

テーブル Wysipage には 0 から n wysipage_content、および 0 から nを指定できますwysipage_menu。from の要素はwysipage_content1 つの Wysipage のみに対応します。from の要素はwysipage_menu、0 または 1 つの Wysipage に対応します。

Wysipages のすべての要素のリストと、それらの最終的なコンテンツとメニューを 1 つの表にまとめて、1 つの要求だけで提供してくれる人に依頼したいと思います。

これが私のテーブル定義です(スキーマ全体を避けています。列があることに注意してくださいwp_idwp_name

class Wysipage extends AppModel {
var $actsAs = array('Containable');
    public $useTable = 'wysipage'; 
public $primaryKey = 'wp_id';
public $displayField = 'wp_name';
var $hasMany = array(
'un' => array(
    'Wysipage_contenu' => array(
        'className'     => 'Wysipage_contenu',
        'foreignKey'    => 'wpc_wp_id',
    )),
'deux' => array(
    'Wysipage_menu' => array(
        'className'     => 'Wysipage_menu',
        'foreignKey'    => 'wpm_wp_id',
    ))
);


class Wysipage_contenu extends AppModel {
var $actsAs = array('Containable');
    public $useTable = 'wysipage_contenu'; 
public $primaryKey = 'wpc_id';
public $displayField = 'wpc_h1';
public $belongsTo = array(
        'Wysipage' => array(
            'className'    => 'Wysipage',
            'foreignKey'    => 'wp_id'
        )
);

class Wysipage_menu extends AppModel {
var $actsAs = array('Containable');
public $useTable = 'wysipage_menu'; 
public $primaryKey = 'wm_id';
public $displayField = 'wm_lien';
public $belongsTo = array(
        'Wysipage' => array(
            'className'    => 'Wysipage',
            'foreignKey'    => 'wm_wp_id'
        )
);

そして、ここにリクエストを試すための私のコードがあります(しかし失敗しました):

$this->loadModel('Wysipage_contenu');
    $this->loadModel('Wysipage_menu');

    $this->Wysipage->contain();
    $mes_wysipages = $this->Wysipage->find('all', array('joins' => array(
        array(
            'table' => 'wysipage_contenu',
            'alias' => 'wpc',
            'type' => 'LEFT',
            'conditions'=> array('wpc.wpc_wp_id = Wysipage.wp_id')
        ),
        array(
            'table' => 'wysipage_menu',
            'alias' => 'wpm',
            'type' => 'LEFT',
            'conditions'=> array('wpm.wm_wp_id = Wysipage.wp_id')
        )
    )));

    $this->set('wysipages', $mes_wysipages);
    $this->render();

私は何を間違えましたか?モデル宣言に問題がありますか? または、間違ったリクエスト タイプを使用していますか? :(

私がしたいリクエストは単純です:

SELECT wp_id, wp_name, wpc_id, wpc_name
FROM wysipage
LEFT JOIN wysipage_contenu ON wysipage.wp_id = wysipage_contenu.wpc_wp_id

これだけ:(

LEFT 結合または RIGHT 結合が必要かどうかさえわかりませんが、とにかく問題は同じままです。このコードでは、同じ行が複数回出現するという悪い答えが得られます:/

ありがとう :/

PS : 英語が下手で申し訳ありません。母国語ではありません。

4

1 に答える 1

0

同じクエリで wp_id のコンテンツ テーブルとメニュー テーブルを結合することはできません。どちらも wp_id と多対 1 の関係にあり、コンテンツの各行に対して、そのような結合の結果として同じ wp_id を持つメニューのすべての行が存在するためです。2 つのクエリを実行する必要があります。1 つはコンテンツ用、もう 1 つはメニュー用です。または、両方のテーブルで同一のリスト列が必要な場合は、この 2 つのクエリから両方の結果を結合できます。

于 2013-02-28T15:53:26.790 に答える