3

私はCakePHPの初心者ですが、今は多対多の状況で立ち往生しています

わかりました、私は3つのテーブルを持っています:

  1. フィールドのある質問 (id、質問)
  2. フィールドを持つ question_product (id、question_id、product_id、question_number、is_enabled)
  3. フィールド (id、name、code、is_enabled) を持つ製品

特定のフィールドで質問を選択したい場合、今のところ修正方法がわかりません。コードは次のようになります。

Question.php (モデル)

class Question extends AppModel {

    public $hasAndBelongsToMany = array (
        'Product' => array (
            'joinTable' => 'question_product',
            'foreignKey' => 'question_id',
            'associationForeignKey' => 'product_id',
            'unique' => 'keepExisting',
            'order' => 'question_number',
            'fields' => array (
                'QuestionProduct.question_number',
                'Product.id',
                'Product.name'
            ),
            'conditions' => array (
                'QuestionProduct.is_enabled' => 1,
            )
        )
    );
}

QuestionsController.php (コントローラー)

public function loadQuestions($productId) {
    $this->view = 'load_questions';
    $questions = $this->Question->find('all', array (
        'fields' => array (
            'Question.id',
            'Question.question',
            'Question.is_optional',
            'Question.reason_optional',
            'Question.text_size'
        ),
        'conditions' => array (
            'QuestionProduct.product_id' => $productId
        )
    ));
    $this->set($questions);
}

メソッド loadQuestions には、指定された製品で選択する 1 つのパラメータがあります

SQLクエリを使用すると、次のようになります

条件 Product.product_id=4 の質問からすべて選択し、QuestionProduct.question_number の昇順で並べ替えます

select questions.*
from questions
join question_product on questions.id=question_product.question_id
join products on products.id=question_product.product_id
where products.id=4
order by question_product.question_number;

どんな答えでも大歓迎です:)

ありがとう !

4

2 に答える 2

2

リレーションを使用する代わりに、question_productからquestionhasAndBelongsToManyの 2 つのbelongsTOリレーションと、question_productからproductsへの別のリレーションを使用します。

question_product belogns質問へ

question_product 所属する製品へ

注: CakePHP の慣習として、テーブル名を question_product から question_products に変更する必要があります。

あなたのモデルで QuestionProduct モデル:

<?php

// declares a package for a class
App::uses('AppModel', 'Model');

class QuestionProduct extends AppModel {

/**
 * @see Model::$actsAs
 */
    public $actsAs = array(
        'Containable',
    );

/**
 * @see Model::$belongsTo
 */
    public $belongsTo = array(
        'Product' => array(
            'className' => 'Product',
            'foreignKey' => 'product_id',
        ),
        'Question' => array(
            'className' => 'Question',
            'foreignKey' => 'question_id',
        ),
    );

次に、コントローラーで:

public function loadQuestions($productId) {
    $this->view = 'load_questions';
    $questions = $this->QuestionProduct->find('all', array (
        'fields' => array (
            'Question.id',
            'Question.question',
            'Question.is_optional',
            'Question.reason_optional',
            'Question.text_size'
        ),
        'conditions' => array (
            'QuestionProduct.product_id' => $productId
        ),
        'contain' => array('Product','Question')
    ));
    $this->set($questions);
}

必要なクエリを正確に作成する必要があり、そのクエリを作成する他の方法はないと思います。

于 2013-01-11T07:54:24.493 に答える
2

条件を必要とする他のフィールドと多対多 (HABTM) 関係を使用するときはいつでも、Cake に関する限り、それはもはや多対多ではありません。HasManyThrough 関係が必要です

于 2013-01-09T08:48:49.200 に答える